簡體   English   中英

EF代碼優先處理多對多關系

[英]EF Code First working with many-to-many relationships

我正在使用Visual Studio 2010,C#4.0和Entity Framework 5.0。 我多年來一直在使用數據庫優先開發技術,但是試圖先開發代碼並遇到問題。 閱讀和搜索似乎無法解決問題

我將問題簡化如下-我有兩個類-評估者和文檔。

public class Assessor
{
    public int AssessorID { get; set; }
    public virtual List<Document> Documents { get; set; }       
}

public class Document
{
    public int DocumentID { get; set; }
    public string DocumentLocation { get; set; }
    public string DocumentName { get; set; }
    public virtual List<Assessor> Assessors { get; set; }
}

與上下文

public class DocumentAssignment : DbContext
{
    public DbSet<Assessor> Assessors { get; set; }
    public DbSet<Document> Documents { get; set; }
}

評估者可以有許多文檔,而一個文檔可以有許多評估者(經典的多對多關系)。 我使用約定創建關系,但也使用了流暢的API。 我已經為文件表添加了種子。

我的兩個問題: 一個 -我想將文件分配給評估者-將其保存到數據庫的最佳方法是什么?

二:我有以下方法來檢索指派給一個評估文件:

public static IEnumerable<MaternalDocument> GetAssignedDocumentList(int UserID, string ConnectionString)
    {
        using (DocumentAssignment dbContext = new DocumentAssignment(ConnectionString))
        {
            return returnValue = dbContext.MaternalAssessments
                .Where(m => m.AssessorID == UserID)
                .Include(m => m.MaternalDocuments)
                .Select(m => m.MaternalDocuments)
                .ToList();
        }
    }

但是由於映射問題,我無法編譯它。 我究竟做錯了什么?

您必須通過重寫DocumentAssignment中的OnModelCreating來告訴DbContext如何建立多對多關系。 用您的關系表名稱替換此代碼中的AssessorDocuments。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Assessor>()
            .HasMany(a => a.Documents)
            .WithMany(d => d.Assessors)
            .Map(m =>
                {
                    m.MapLeftKey("AssessorID");
                    m.MapRightKey("DocumentID");
                    m.ToTable("AssessorDocuments");
                });
        base.OnModelCreating(modelBuilder);
    }

要將文檔分配給評估者(假設文檔ID為1,文檔存在,評估者ID為1,則存在評估者):

        using (var context = new DocumentAssignment())
        {
            var assessor = context.Assessors.Find(1);
            var document = context.Documents.Find(1);
            assessor.Documents.Add(document);
            context.SaveChanges();
        }

您的GetAssignedDocumentList方法看起來像這樣:

public static IEnumerable<Document> GetAssignedDocumentList(int UserID)
    {
        using (var context = new DocumentAssignment())
        {
            return context.Documents.Where(d => d.Assessors.Any(a => a.AssessorID == UserID));
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM