将对象保存到数据库结果:" IEntityChangeTracker"的多个实例不能引用实体对象。

时间:2014-05-16 20:34:17

标签: c# entity-framework

我正在尝试将对象保存到我的数据库中,但由于上面指定的异常消息,我无法将其保存。

以下是我正在做的事情:

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对象有关,因为如果它们为null,则在我尝试保存时它不会自行处理。

我的上下文类:

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。我在这里完全不知所措。

1 个答案:

答案 0 :(得分:1)

您需要确保所有存储库都使用相同的上下文进行原子操作。因此,您需要创建上下文并将其传递到构造函数中的存储库中。像这样:

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