2

我将实体框架 v4 用于一个小项目。通常我使用NHibernate。我的问题是我不小心添加了一个已经持久化到数据库上下文集合中的对象的代码,当我执行 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();
4

3 回答 3

1

您是否尝试过没有添加 ccuser 的行(例如倒数第二行)。如果对象已经附加到上下文, savechanges() 应该保留更改。如果这不起作用,请尝试在 savechanges() 之前调用 detectchanges()。

于 2010-11-18T18:26:43.587 回答
1

你怎么知道它是同一个物体?

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

于 2010-11-17T21:31:41.473 回答
0

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

方法.Add标记。entity_ EntityState.Added并且当您在上下文项中添加存在时,EF 会因为延迟加载而将其视为新对象。

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

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

这里是MSDN上的相关问题

于 2016-05-26T12:18:37.897 回答