0

У меня есть следующие модели:обновление внешнего ключа объекта в EF6

public class DivorceCases 
{ 
    [Key] 
    [Required] 
    public string case_id { get; set; } 
    public string archived { get; set; } 
    public virtual Plaintiff p { get; set; } 
} 

public class Plaintiff{ 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int id { get; set; } 
    public string name { get; set; } 
} 

Я имею видовую из DivorceCases для редактирования и в контроллере, я использую:

DivorceCases dcold = db.DivorceCase.Where(x => x.case_id == dc.case_id).Include(x => x.p).SingleOrDefault(); 
      dcold.p = dc.p; 
      db.Entry(dcold).State = EntityState.Modified; 
      db.SaveChanges(); 

Когда я обновляю, вместо Чтобы обновить существующую запись в таблице истцов, EF6 вставляет новую запись в таблицу истцов и обновляет ссылку на внешний ключ для этой новой записи в таблице DivorceCases. Что я делаю не так? Как я могу избавиться от этого?

+0

Вы показали все классы? Я думаю, что это может иметь отношение к коду инициализации в конструкторах. –

+0

@GertArnold нет, сэр это не весь класс. На самом деле для моего случая, у меня есть решение, которое я разместил ниже. –

ответ

0

У меня есть решение после многократной отладки и испытаний и испытаний.

Прежде всего я сделал DBContextExtension класса, как это:

public static T Modify<T>(this T t,T tnew) 
    { 
     PropertyInfo[] properties = typeof(T).GetProperties(); 
     foreach (PropertyInfo property in properties) 
     { 
      if (property.Name != "id" && (property.PropertyType==typeof(string) || property.PropertyType==typeof(DateTime))) 
      { 
       if (property.GetValue(tnew) != null) 
       property.SetValue(t, property.GetValue(tnew)); 
      } 
     } 
     return t; 
    } 

Тогда для каждого внешнего ключа ссылается объект, я назвал этот метод расширения и получил 100% успеха.

DivorceCases dcold = db.DivorceCase.Where(x => x.case_id == dc.case_id).Include(x => x.p).SingleOrDefault(); 
      dcold = dcold.Modify(dc); 
      dcold.p = dcold.p.Modify(dc.p); 
      dcold.d = dcold.d.Modify(dc.d); 
      db.SaveChanges(); 
0

Вы запрашиваете у вашего прикрепленного объекта сущности ссылку на элемент , а не, прикрепленный к контексту.

Попробуйте прикрепить dc.p сначала или просто изменить идентификатор истца на корпус вместо изменения объекта.

+0

не могли бы вы сказать, пожалуйста, сэр. я не получил твоих слов. –

+0

db.Plaintiff.Attach (dc.p); –

+0

Это решение не сработало для меня. –

0

Вместо назначения dc.p для dcold.p присвоить свойства dc.p в dcold.p «ы свойства затем называют SaveChanges();. вам не нужно db.Entry(dcold).State = EntityState.Modified; структура сущности обновит ваши данные вместо создания новой записи. Попробуйте использовать следующий код:

DivorceCases dcold = db.DivorceCase.Where(x => x.case_id == dc.case_id) 
      .Include(x => x.p).SingleOrDefault(); 
      dcold.p.name = dc.p.name; 
      db.SaveChanges(); 
+0

очень сложно обновить все свойства вручную. –

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