实体框架添加现有项导致克隆

时间:2010-11-17 20:49:08

标签: entity-framework code-first

我正在将Entity Framework v4用于一个小项目。通常我使用NHibernate。我的问题是我偶然发现了一个代码,它添加了一个已经保存到DB Context集合中的对象,当我执行了SaveChanges()时,EF制作了一个对象的副本,为它提供了一个新的主键。

虽然这很有用,但这不是我想要的。有没有办法关闭该功能,而是抛出异常?

更新:现在包含的代码

public class CcUser
{
    public int Id { get; set; }
    [StringLength(50)]
    public string TrackingId { get; set; }
    [StringLength(50)]
    public string MembershipGuid { get; set; }

    public bool CookiesConfirmed { get; set; }
    [StringLength(200)]
    public string Email { get; set; }

    public DateTime Modified { get; set; }

}

public class MyDbContext : DbContext
{
    public DbSet<CcUser> Users { get; set; }

}

MyDbContext db = new MyDbContext();

var ccUser = db.Users.FirstOrDefault(u => u.TrackingId == id);   
ccUser.Modified = DateTime.UtcNow;
db.Users.Add(ccUser);
db.SaveChanges();

3 个答案:

答案 0 :(得分:1)

你怎么知道这是同一个对象?

例如,如果是因为它具有相同的名称,那么您可以在名称字段上添加唯一索引。这样添加一个重复行会引发异常。

答案 1 :(得分:1)

你是否在没有线路的情况下尝试添加ccuser(例如倒数第二行)。如果对象已附加到上下文,则savechanges()应保留更改。如果这不起作用,那么尝试在savechanges()之前调用detectchanges()。

答案 2 :(得分:0)

对于遇到这个问题的每个人:

使用.Add标记entity的方法EntityState.Added。当您在上下文项中添加现有项时,由于延迟加载,EF会将其视为新对象。

然后context.SaveChanges()将为添加的项目生成新的主键并将其保存到DB

如果您不需要该功能,请使用AddOrUpdate

此处有关MSDN

的相关问题