2013-03-09 19 views
6

Ponieważ mój angielski nie jest dobry, po prostu od razu do rzeczy. Dlaczego nagrywanie Firma w bazie danych utworzyć nowy rekord i rekord Klienta odnoszą się do nowego rekordu firmy? Dzięki za pomoc :)Entity Framework - Duplikat rodzica (jednego) podczas tworzenia nowego dziecka (wiele)

public class Company : EntityBase 
{ 
    public string Name { get; set; } 

    public List<Customer> Customers { get; set; } 
    public List<Invoice> Invoices { get; set; } 
} 

public class Customer : EntityBase 
{ 
    public string Name { get; set; } 

    public Company Company { get; set; } 
    public List<Card> Cards { get; set; } 
} 

public class EFRepositoryBase<TEntity> where TEntity : class, IEntity, new() 
{ 
    protected IUnitOfWork UnitOfWork { get; set; } 

    protected BenzineFleetContext Context 
    { 
     get { return (BenzineFleetContext) UnitOfWork; } 
    } 

    public virtual DbSet<TEntity> GetDbSet<TEntity>() where TEntity : class 
    { 
     return Context.Set<TEntity>(); 
    } 

    public virtual void Add(TEntity entity) 
    { 
     GetDbSet<TEntity>().Add(entity); 
    } 

    public virtual void SaveChanges() 
    { 
     Context.SaveChanges(); 
    } 
} 

    //Save 

var cus = new klienta {Spółka = SelectedCompany}

_srv.Add(cus); 
    _srv.SaveChanges(); 
+0

Istnieje kilka relacji i innych rzeczy, może ... Czy możesz jasno określić, co dokładnie chcesz zrobić? –

+0

Chcę utworzyć nowego klienta, customer.Company = Wybrana firma z bazy danych – yovierayz

Odpowiedz

11

Gdy dodajesz podmiot poprzez DbSet<T>.Add metoda, jednostki i wszystko to odwołuje podmioty nie co w kontekście jednak zostanie oznaczony jako Added w ChangeTracker. Dlatego nowa firma dodaje (wygląda jak firmy nie jest przyłączony do kontekstu):

var customer = new Customer {Company = SelectedCompany} 
context.Customers.Add(customer); 
// at this point customer state will be Added 
// company state also will be Added 
context.SaveChanges(); 

Aby uniknąć takiego zachowania, należy dołączyć firmę do kontekstu przed dodaniem nowego klienta:

var customer = new Customer {Company = SelectedCompany} 
context.Companies.Attach(SelectedCompany); 
context.Customers.Add(customer); 
// at this point customer state will be Added 
// company state will be Unchanged (if you haven't change it) 
context.SaveChanges(); 

Innym sposobem jest utrzymywanie stanów ręcznie:

var customer = new Customer {Company = SelectedCompany} 
context.Customers.Add(customer); 
context.Entry(SelectedCompany).State = EntityState.Unchanged; 
// at this point customer state will be Added 
// company state will be Unchanged 
context.SaveChanges(); 
+0

Ale w inny sposób, dodaję kartę, odwołuję się do klienta to samo z poleceniem Poleć klienta firmy, nie tworzy duplikatu rekordu. – yovierayz

+0

@yovierayz wygląda jak zapis jest w kontekście w takim przypadku –

+1

okazuje się, że problem polegał na dodaniu listy firm, tworzę nowy obiekt dwukrotnie na liście firm. Ale droga, dzięki za pomoc, zastosuję twój przykład, by ulepszyć mój kod :) – yovierayz

-2

Widać this i this dla wszystkich podstawowych CRUD (Create Czytaj Aktualizacja Usuń) operacja w strukturze podmiotu. Będzie ci bardzo pomocna. Możesz także krótko zrozumieć klucz obcy funda i jeden do wielu relacji.

Powiązane problemy