EF Code首先处理多对多关系

本文关键字:关系 处理 Code EF | 更新日期: 2023-09-27 18:17:59

我使用的是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。我已经播种了文档表。

我的两个问题:ONE -我想将文档分配给评估人员-将其保存到数据库的最佳方法是什么?

TWO我有以下方法来检索分配给评估员的文档:

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();
        }
    }

,但由于映射问题,我无法使其编译。我做错了什么?

EF Code首先处理多对多关系

您必须通过在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);
    }

将一个文档分配给一个评估员(假设存在一个文档,其documententid为1,存在一个评估员,其AssessorID为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));
        }
    }