2015-05-11 5 views
1

Я следующая структуру в SQL Server DBEf6 не обновляет, вставляет только

компании -> Отрасли -> BranchTelephone -> TelephoneNumber

Таким образом, компания имеет много ветвей, которые имеют много telephonenumbers. Отраслевая TelephoneNumber многие к многим

Вот Entity классы:

public class Company 
    { 
     public Company() 
     { 
     this.Branches = new HashSet<Branch>(); 
     } 

     [Key] 
     //identity column in sql server 
     public int Id{ get; set; } 
     public string Name{ get; set; } 
     public virtual ICollection<Branch> Branches{ get; set; } 
    } 

    public partial class Branch 
    { 
     /// <summary> 
     /// Initializes a new instance of the <see cref="Branch"/> class. 
     /// </summary> 
     public Branch() 
     { 
      this.TelephoneNumbers = new HashSet<TelephoneNumber>();   
     } 

     [Column("BranchID")] 
     [Key] 
     public int Id { get; set; } 

     public int CompanyId{ get; set; } 

     public virtual Company Company { get; set; } 

     public virtual ICollection<TelephoneNumber> TelephoneNumbers { get; set; } 
    } 

public partial class TelephoneNumber 
{ 
    public TelephoneNumber() 
    { 
     this.Branches = new HashSet<Branch>(); 
    } 

    [Key] 
    [Column("TelephoneID")] 
    public int Id { get; set; } 

    public virtual ICollection<Branch> Branches { get; set; }  
} 

Я пытаюсь сделать следующее, чтобы проверить настройки:

var t1 = new TelephoneNumber(); 
var t2 = new TelephoneNumber(); 
using(var context = new MyDbContext()) 
{ 
    var company = new Company 
    { 
    Name = "C1", 
    Branches = 
    { 
     new Branch 
     { 
     TelephoneNumbers = {t1, t2} 
     } 
    }   
    }; 
    context.SaveChanges(); 
} 

На данный момент смотрят SQAl Profiler сервера и runnign SQL, все данные
вставлены правильно

using(var c2 = new MyDbContext()) 
{ 
    var company2 = c2 .Companies.First(x=>x.Name == "C1"); 
    var b1 = company2 .Branches.First(); 

    //data matches what is inserted above 

    b1.TelephoneNumbers.Clear(); 
    b1.TelephoneNumbers.Add(new TelephoneNumber()); 

    company2.Name = "Updated"; 

    c2.SaveChanges(); 
} 

Atfer выше сохранить изменения followign заявления получить genrated на SQL сервере

1. Update Company set name = "Updated" -- Correct 
2. Delete from BranchTelephone the two entries that were added during first insert 
3. Insert New Company 
4. Insert new Branch 
5. Insert new Telephone Number 
6. Insert new Branch Telephone 
7. Insert new Telephone Number 
8. Insert new Branch Telephone 
9. Insert new Telephone Number 
10. Insert new Branch Telephone 

Так в основном он обновляет и удаляет как ожидалось.

Но затем идти о воссоздании все от одного шага, так что у меня есть в общей сложности 3 телефонных номеров вместо 1.

Я понятия не имею, что здесь происходит. Любая помощь будет оценена по достоинству.

спасибо.

Я играл и оказывается

все нормально, если я ommit следующие строки: b1.TelephoneNumbers.Add (новый TelephoneNumber());

В порядке я имею в виду, что он обновляет данные и удаляет все связанные телефонные номера. Но если я делаю выше строки в том же контексте, то он забывает обо всем остальном и просто вставляет все новые, т. Е. Новую компанию, филиал и 3 телефонных номера (включая два удаленных).

Это просто неприемлемо. Что я делаю неправильно здесь

+0

Необходимо пометить дочерние объекты как измененные. Это боль. Вы также можете использовать GraphDiff. http://stackoverflow.com/questions/24789903/updating-child-entities-in-entity-framework-mvc –

+0

Это было проблемой. Одно из сущностей было из отдельного экземпляра контекста db, следовательно, создавая все это. – ASR

ответ

0

Проблема оказалась одной сущностью, принадлежащей отдельному экземпляру dbcontext. Таким образом, context1 использовался для получения экземпляра entityA, который был добавлен в context2.entityBCollection, заставляя EF вставлять все, а не только экземпляр entityA.

Я думаю, что это какая-то ошибка в EF, потому что если entityA не был привязан к contextB, либо он должен был создать исключение или только созданную сущностьA в базе данных. Но вместо этого contextB отправил вставки для всей иерархии объектов, которые были привязаны к contextB к базе данных.

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