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();
}
}
,但由于映射问题,我无法使其编译。我做错了什么?
您必须通过在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));
}
}