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();
}
}
}