Hi.
I've got Clients and VIPClients entities in a database. Both of them are generated by Data Access Visual Designer. For some reason (I support the project, so I don't know why) these generated classes also have partial classes with additional logic. Both of them also implemented IClient in these partial classes.
In some moment program collect all clients by union into IReadOnlyList<IClient> and save them. Save method is below:
public void Save(IReadOnlyList<IClient> clients) { foreach(var client in clients) { if(client is Client) { var cclient = client as Client; cclient.CompanyId = _companyId; _database.Add(cclient); _database.SaveChanges(); } if(client is VIPClient) { var cclient = client as VIPClient; cclient.CompanyId = _companyId; _database.Add(cclient); _database.SaveChanges(); } }}Clients and VIPClients have Company (one Company has a lot of Clients). In the code above _companyId is Id of existed Company that already in database. But for some reason Data Access tries to insert Company in database instead of just inserting Client or VIPClient. Why can this occur?
I found the solution, but it's ugly:
public void Save(IReadOnlyList<IClient> clients) { foreach(var client in clients) { if(client is Client) { var cclient = client as Client; cclient.CompanyId = _companyId; var company = _database.Companies.SingleOrDefault(c=>c.Id == _companyId); if(company != null) { cclient.Company = company; } _database.Add(cclient); _database.SaveChanges(); } if(client is VIPClient) { var cclient = client as VIPClient; cclient.CompanyId = _companyId; var company = _database.Companies.SingleOrDefault(c=>c.Id == _companyId); if(company != null) { cclient.Company = company; } _database.Add(cclient); _database.SaveChanges(); } }}