2015-09-08 2 views
2

У меня возникла проблема, когда я пытаюсь сохранить новый объект с существующими объектами вложенными. Вместо того, чтобы создавать отношения с существующими сущностями, они дублируют их.Вложенная существующая сущность дублируется при сохранении родителя

Это примерно моя модель:

public class Record 
{ 
    public int ID { get; set; } 
    public string RecordValue { get; set; } 
    public virtual ICollection<AddressLine> AddressLines { get; set; } 
} 
public class AddressLine 
{ 
    public int ID { get; set; } 
    public string AddressLineValue { get; set; } 
    public virtual ICollection<AddressLineType> AddressLineTypes { get; set; } 
} 
public class AddressLineType 
{ 
    public int ID { get; set; } 
    public string AddressLineTypeValue { get; set; } 
} 

Я не хочу никаких дубликатов AddressLineTypes добавил так в моем коде я делаю что-то вроде этого:

public void button1_Click(object sender, EventArgs e) 
{ 

    Record r = new Record(); 
    r.RecordValue = "Record value"; 

    AddressLine al = new AddressLine(); 
    al.AddressLineValue = "Address line value"; 

    AddressLineType alt; 
    using (var db = new MyDbContext()) 
    { 
     alt = db.AddressLineTypes.Single(x => x.Value == "TypeValue"); 
    } 

    al.AddressLineTypes.Add(alt); 
    r.AddressLines.Add(al); 

    SaveRecord(r); 
} 

public void SaveRecord(Record r) 
{ 
    using (var db = new MyDbContext()) 
    { 
     db.Records.Add(r); 
     db.SaveChanges(); 
    } 
} 

Я достиг точки останова перед db.SaveChanges() и AddressLineType Идентификатор заполняется, но он создает новые записи в базе данных, как если бы ID == 0.

Как остановить существующий AddressLineTypes дублирование при сохранении?

ответ

2

Попробуйте использовать один контекст:

...  
using (var db = new MyDbContext()) 
     { 
      alt = db.AddressLineTypes.Single(x => x.Value == "TypeValue"); 


      al.AddressLineTypes.Add(alt); 
      r.AddressLines.Add(al); 

      SaveRecord(r, db); 
     } 
    } 

public void SaveRecord(Record r, MyDbContext db) 
{ 
     db.Records.Add(r); 
     db.SaveChanges(); 
} 
+0

Спасибо, я буду видеть, если я могу получить, чтобы работать. Моя логика немного странна, поскольку данные поступают через слушателя, поэтому я делаю запрос, а затем цикл while проверяет индекс словаря для токена запроса и захватывает объект из значения. Мне пришлось бы вытащить много логики из моего слушателя, чтобы заставить это работать. Думаю, мне нужно реорганизовать весь код, я надеялся на быстрый способ сделать вложенные сущности правильно сохраненными, если их отсоединить от контекста :( – Guerrilla

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