0

ユーザーがデータを選択してレポートとして表示できるレポートシステムを構築しました。レポートは 3 つのテーブルに保存されます (分割エンティティ)。しかし、レポートを編集して再度保存しようとすると、次のエラーが発生します。

エンティティ オブジェクトは、IEntityChangeTracker の複数のインスタンスによって参照できません

私のエンティティ:

public class Report
{
    [Key]
    public int ReportId { get; set; }
    public string Title { get; set; }
    public int? DateRange { get; set; }
    public int Layout { get; set; }
    public DateTime? DateFrom { get; set; }
    public DateTime? DateTo { get; set; }
    public int OwnerId { get; set; }
    public DateTime DateCreated { get; set; }
    public bool Active { get; set; } 
    public virtual List<ReportCharts> ReportCharts { get; set; }
    public virtual List<ReportElements> ReportElements { get; set; }
}

私のEFリポジトリ:

//Save Report to Database 
    public void Save(Report report)
    {
        assignSettingsToEntity(report);
        assignElementsToEntity(report);
        assignChartsToEntity(report);

        int found = Reports
            .Select(r => r.ReportId)
            .Where(id => id == report.ReportId)
            .SingleOrDefault();

        if (found == 0)
        {
            context.Reports.Add(report);
        }
        else
        {
            context.Entry(report).State = EntityState.Modified; // Here I get error 
        }
        context.SaveChanges();     
    }

私のDBContext

class EFDbContext : DbContext
{
    //Get Lines data from Lines table
    public DbSet<Line> Lines { get; set; }

    //Get Shifts data from Shifts table
    public DbSet<Shift> Shifts { get; set; }

    //Get list of Charts from Charts table
    public DbSet<Graph> Graphs { get; set; }

    //Get Reports data from Reports table
    public DbSet<Report> Reports { get; set; }

    // Report entity mapping
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Report>().Property(t => t.ReportId).HasColumnName("ReportId");
        modelBuilder.Entity<Report>().Property(t => t.Title).HasColumnName("Title");
        modelBuilder.Entity<Report>().Property(t => t.DateRange).HasColumnName("DateRange");
        modelBuilder.Entity<Report>().Property(t => t.Layout).HasColumnName("Layout");
        modelBuilder.Entity<Report>().Property(t => t.DateFrom).HasColumnName("DateFrom");
        modelBuilder.Entity<Report>().Property(t => t.DateTo).HasColumnName("DateTo");
        modelBuilder.Entity<Report>().Property(t => t.OwnerId).HasColumnName("OwnerId");
        modelBuilder.Entity<Report>().Property(t => t.DateCreated).HasColumnName("DateCreated");
        modelBuilder.Entity<Report>().Property(t => t.Active).HasColumnName("Active");
        modelBuilder.Entity<Report>().HasMany(t => t.ReportElements).WithRequired().HasForeignKey(c => c.ReportId).WillCascadeOnDelete(true);
        modelBuilder.Entity<Report>().HasMany(t => t.ReportCharts).WithRequired().HasForeignKey(p => p.ReportId).WillCascadeOnDelete(true);
        modelBuilder.Entity<ReportElements>().Property(c => c.ElementName).HasColumnName("ElementName");
        modelBuilder.Entity<ReportElements>().HasKey(c => new { c.ReportId, c.ElementName, c.Active });
        modelBuilder.Entity<ReportCharts>().Property(p => p.ChartId).HasColumnName("ChartId");
        modelBuilder.Entity<ReportCharts>().HasKey(c => new { c.ReportId, c.ChartId, c.Active });
    }

}

助けてくれてありがとう。

4

2 に答える 2

1

Entity Framework はすべてのエンティティを 1 つのコンテキストにアタッチし、すべての変更はアタッチされているコンテキストでのみ実行できます。おそらく複数のコンテキストを使用しています。異なるコンテキストから取得したエンティティをデタッチおよびアタッチする必要があります。

それ以外の場合、ベスト プラクティスは、コンテキストの複数のインスタンスを使用せず、変更全体で 1 つのコンテキストのみを保持することです。

于 2013-09-14T13:40:19.533 に答える