2014-05-16 26 views
1

我試圖將一個對象保存到我的數據庫,但由於上述指定的異常消息我無法保存。將對象保存到數據庫結果中:「一個實體對象不能被IEntityChangeTracker的多個實例引用」

下面是我在做什麼:

Player player = playerRepository.Find(universeId, playerId); 
UserProperties userProperties = userPropertiesRepository.Find(User.Identity.GetUserId()); 

rated = new Ratings 
{ 
    Player = player, 
    RatingType = ratingsIdentifier, 
    UserProperties = userProperties 
}; 

ratingsRepository.InsertOrUpdate(rated); 

InsertOrUpdate()(和Save())方法:

public void InsertOrUpdate(Ratings ratings) 
{ 
    if (ratings.RatingsId == default(int)) 
    { 
     // New entity 
     context.Ratings.Add(ratings); // this is where the exception happens 
    } 
    else 
    { 
     // Existing entity 
     context.Entry(ratings).State = EntityState.Modified; 
    } 

    Save(); 
} 

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

我有這個問題的一個基本的瞭解,我只是不」不知道如何解決它。我可以告訴它它與PlayerUserProperties對象有關,因爲如果它們爲空,那麼當我嘗試保存時它不會自行消失。

我的上下文類:

public class ApplicationUser : IdentityUser 
{ 
} 

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("DefaultConnection") 
    { 
    } 

    public DbSet<Player> Players { get; set; } 
    public DbSet<ServerData> ServerDatas { get; set; } 
    public DbSet<Ratings> Ratings { get; set; } 
    public DbSet<UserProperties> UserProperties { get; set; } 

    // some more DbSet<> 
} 

我試圖閱讀關於這個的其他主題,但我不能,例如,detach()IdentityDbContext。我在這裏完全不知所措。

+0

您的'userPropertiesRepository'是否使用與'playerRepository'相同的上下文實例? – DavidG

+0

每個存儲庫都有一行'private readonly ApplicationDbContext context = new ApplicationDbContext();'在頂部。這正是MvcScaffold的腳手架。 – MrGraversen

+0

您需要有一個上下文才能同時使用這兩個存儲庫。 – DavidG

回答

1

您需要確保所有存儲庫對原子操作都使用相同的上下文。所以您需要創建您的上下文並將其傳遞到構造函數中的存儲庫中。類似這樣的:

var ctx = new ApplicationDbContext(); 
var playerRepository = new PlayerRepository(ctx); 
var userPropertiesRepository = new UserPropertiesRepository(ctx); 
+0

謝謝,我用http://stackoverflow.com/questions/21671590/how-to-handle-this-scenario-in-mvc-c來解決我的問題。 – MrGraversen

+0

是的,UoW範例通常與存儲庫結合使用。很高興你把事情解決了。 – DavidG

+0

感謝您的幫助! – MrGraversen

相關問題