Wie joins verwenden mit generischen repository-Muster - Entity Framework

Ich habe eine Generic Repository wie unten, die Griffe meiner CRUD, für eine Einheit die einfach zu bedienen, problem beginnt, wenn ich versuche zu join my POCOs.

Können sagen, ich habe diese POCO, der Sie zugeordnet sind, mithilfe der fluent-api (viele zu viele-und One to many relation) :

public class Student
{
    public Student() 
    {
        this.Courses = new HashSet<Course>();
    }

    public int StudentId { get; set; }
    public string StudentName { get; set; }

    //FKs 
    public virtual Standard Standard { get; set; }
    public int StdandardRefId { get; set; }

    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    public Course()
    {
        this.Students = new HashSet<Student>();
    }

    public int CourseId { get; set; }
    public string CourseName { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}
public class Standard
{
    public Standard()
    {
        Students = new List<Student>();
    }
    public int StandardId { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}

Mapping:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //Many-To-Many
    modelBuilder.Entity<Student>()
                .HasMany<Course>(s => s.Courses)
                .WithMany(c => c.Students)
                .Map(cs =>
                        {
                            cs.MapLeftKey("StudentRefId");
                            cs.MapRightKey("CourseRefId");
                            cs.ToTable("StudentCourse");
                        });
        //One-To-Many
        modelBuilder.Entity<Student>()
                .HasRequired<Standard>(s => s.Standard)
                .WithMany(s => s.Students)
                .HasForeignKey(s => s.StandardId);

}

Generic Repository:

public class Repository<T> : IRepository<T>
    where T : class, IDisposable
{
    internal MyDbContext context;
    internal DbSet<T> dbSet;

    public Repository()
    {
        context = new MyDbContext();
        this.dbSet = context.Set<T>();
    }

    public bool Add(T entity)
    {
        var query = dbSet.Add(entity);

        if (query != null)
            return true;
        return false;
    }

    public bool Update(T entity)
    {
        dbSet.Attach(entity);
        var query = context.Entry(entity).State = EntityState.Modified;

        if (query == EntityState.Modified)
            return true;
        return false;
    }
    public bool Delete(T entity)
    {
        var query = dbSet.Remove(entity);

        if (query != null)
            return true;
        return false;
    }
    public bool Delete(Guid id)
    {
        var query = dbSet.Remove(dbSet.Find(id));

        if (query != null)
            return true;
        return false;
    }
    public T GetById(Guid id)
    {
        var query = dbSet.Find(id);

        if (query != null)
            return query;
        else
            return null;
    }
    public ICollection<T> GetAll()
    {
        return dbSet.AsEnumerable<T>().ToList();
    }

    public void Save()
    {
        context.SaveChanges();
    }
    public void Dispose()
    {
        if (context != null)
        {
            context.Dispose();
            context = null;
        }
    }
}

Nun wenn ich joinen will Standard für Viele-zu-Viele-Tabelle, wie kann ich in der Lage sein, dies zu tun?

Ich sehe diese Frage erscheint immer wieder, aber immer noch nicht verstehen, warum Menschen verwenden Sie die generische repository-Muster mit EF. Sieht völlig nutzlos für mich, und wie Sie sehen, bringt nur unnötige Kopfschmerzen.
Konnte Sie klären Sie Ihre Frage ein wenig, bitte? Ich sehe nicht, wie Sie wollen zu join dieser beiden Tabellen ist, oder warum.
also Sie empfehlen, nicht mit generischen repository? darf ich Fragen, warum
Gut, ich sollte Sie Fragen, warum Sie es verwenden. Sie können keine komplexen Abfragen, auch einfach beitreten. Aktualisieren zwei verschiedene Entitäten, erstellen Sie zwei repositories und open-2 Datenbank-verbindungen und sogar wickeln, in die Transaktion. Nur Nachteile, die mit fast null Vorteile. Macht keinen Sinn für mich.

InformationsquelleAutor Valkyrie | 2017-03-11

Schreibe einen Kommentar