我正在使用 Visual Studio 2010、C# 4.0 和 Entity Framework 5.0。多年来,我一直在使用数据库优先开发,但我试图转向编码优先,但遇到了问题。阅读和搜索似乎没有解决问题
我已将我的问题简化如下 - 我有两个类 - Assessors 和 Documents。
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 - 我想将文档分配给评估员 - 将其保存到数据库的最佳方法是什么?
二 我有以下方法来检索分配给评估员的文件:
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));
}
}
关于c# - EF Code First 处理多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17049783/