1

私はEFコードファーストとASP.NET MVCを使用してWebアプリケーションを構築しています。私はUnitOfWorkのを持っていなかった、まずEntity Frameworkコード、作業単位、リポジトリおよび共有DbContext

public interface IUnitOfWork 
{ 
    void Save(); 
} 

public class CleanStreets : DbContext, IUnitOfWork 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Role> Roles { get; set; } 
    public DbSet<Point> Points { get; set; } 
    public DbSet<Rating> Ratings { get; set; } 
    public DbSet<Picture> Pictures { get; set; } 
    public DbSet<Problem> Problems { get; set; } 
    public DbSet<Comment> Comments { get; set; } 
    public DbSet<Category> Categories { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>() 
        .HasMany(u => u.Comments) 
        .WithRequired(c => c.User) 
        .HasForeignKey(c => c.UserID) 
        .WillCascadeOnDelete(false); 

     base.OnModelCreating(modelBuilder); 
    } 

    public void Save() 
    { 
     this.SaveChanges(); 
    } 
} 


public class EFProblemRepository : IProblemRepository 
{ 
    private readonly CleanStreets data; 

    public EFProblemRepository(CleanStreets data) 
    { 
     this.data = data; 
    }   

    public void Save(Problem problem) 
    { 
     if (problem.ProblemID == 0) 
     { 
      data.Problems.Add(problem); 
     } 

     data.Save(); 
    } 
    ... 
} 

IProblemRepository 
EFProblemRepository 
ICategoryRepository 
EFCategoryRepository 
CleanStreets // db context 
IUnitOfWork 
// etc. 

コードスニペット:私は、次の種類があります。私はすべてのリポジトリに新しいコンテキストを作成しました。しかし、私はProblemを保存したかった後(ProblemCategoryを含みます)、上記のSaveメソッドを使用して、私は次のエラーを受け取った:

An entity object cannot be referenced by multiple instances of IEntityChangeTracker

私はこの問題は私のデシベルコンテキストとであることを、stackoverflowの上、見つかりましたソリューションは、作業パターンのユニットと共有されたコンテキストを作成することでした。私はそれをやろうとしましたが(上記のように)、私はまだエラーが発生します。 Problemを保存するたびにエラーが表示されます。私は "共有" dbコンテキストを実装しましたか?

+0

あなたのリポジトリはCleanStreetsに依存していますか?それをコンストラクタ経由で渡していますか? – BZink

+1

Problemエンティティはどのように作成されますか?あなたの質問には、使用している操作に関する情報がありません。この場合のマッピングはまったく役に立たない情報です。 –

答えて

1

エラーメッセージに基づいて、オブジェクトを別のコンテキストに保存するために、あるコンテキストからオブジェクトを切り離す必要があります。これを行うために、最初からコピーされた新しいオブジェクト(ここで必要なディープコピー)を作成することもできます。また、オブジェクト参照対応を持たない外部キーを処理するために必要な追加の考えもあります。

関連する問題