2010-11-17 4 views
2

Я использую Entity Framework v4 для небольшого проекта. Обычно я использую NHibernate. Моя проблема в том, что у меня случайно был код, который добавил объект, который уже был сохранен в коллекции контекста DB, и когда я сделал SaveChanges(), EF сделал копию объекта, предоставив ему новый Первичный ключ.Entity Framework Добавление существующего Item Causes Clone

Хотя это полезно, это не то, что я хотел. Есть ли способ отключить эту функциональность, и вместо этого возникает исключение?

UPDATE: КОД NOW ВКЛЮЧЕНО

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(); 
+0

Можете ли вы показать код которым вызвал вопрос? –

+0

Код добавлен, спасибо. –

ответ

1

Как вы знаете, что это был тот же объект?

Например, если это было потому, что оно имело то же имя, то вы могли бы добавить уникальный индекс в поле имени. Таким образом, добавление повторяющейся строки приведет к исключению.

+0

Он имел тот же первичный ключ. Я получил его с помощью FirstOrDefault, изменил одно не-ключевое свойство и добавил его в список и сохранил. Результатом был другой объект, а не исключение. –

1

Вы попробовали это без строки, чтобы добавить ccuser (например, предпоследнюю линию). Если объект уже привязан к контексту, savechanges() должен сохранять изменения. Если это не работает, попробуйте вызвать detectchanges() перед savechanges().

+0

Я знаю это, но если я случайно добавлю существующий объект, я хочу, чтобы EF выбрал исключение столкновений PK, не перезаписывая мой ПК и клон! –

+1

- ваш первичный ключ столбца идентификации? если это так, я думаю, что ef code-first будет отмечать его как сгенерированное хранилище, и любая попытка добавить объект будет игнорировать любое ранее установленное значение. я думаю, вам либо придется сначала проверить, существует ли сущность с этим первичным ключом, и обновить соответствующий объект или попытаться присоединить отдельный объект к контексту. add делает то, что он называет –

0

Для всех, кто бежать в эту проблему:

Метод .Add маркировки entity с EntityState.Added. И когда вы добавляете существующий элемент контекста, EF будет рассматривать его как новый объект из-за Lazy Loading.

И после этого context.SaveChanges() сгенерирует новый первичный ключ для добавления предмета и сохранит его до DB.

Используйте AddOrUpdate, если вам не нужна эта функция.

Здесь связан вопрос о MSDN

Смежные вопросы