1

Visual Studio 2010、C# 4.0、および Entity Framework 5.0 を使用しています。私は長年データベース ファースト開発を使用してきましたが、コード ファーストに移行しようとしていて、問題が発生しています。読んだり検索したりしても問題は解決しないようです

私は次のように問題を単純化しました - 私は評価者と文書の 2 つのクラスを持っています。

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 も使用しています。ドキュメントテーブルをシードしました。

私の 2 つの質問: 1 つ -ドキュメントを評価者に割り当てたい - これをデータベースに保存する最良の方法は何ですか?

2評価者に割り当てられたドキュメントを取得するには、次の方法があります。

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 に答える