Entity Framework Добавление существующего элемента вызывает клонирование - PullRequest
2 голосов
/ 17 ноября 2010

Я использую Entity Framework 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();

Ответы [ 3 ]

1 голос
/ 18 ноября 2010

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

1 голос
/ 18 ноября 2010

Откуда вы знаете, что это был один и тот же объект?

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

0 голосов
/ 26 мая 2016

Для всех, кто столкнулся с этой проблемой:

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...