1

我正在使用 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();
        }
    }

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

4

1 回答 1

5

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

要将文档分配给评估者(假设存在 DocumentID 为 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));
        }
    }
于 2013-06-11T17:15:52.270 回答