Adding Related Entities without using navigation properties
- by Barisa Puter
I have the following classes, set for testing:
public class Company
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
}
public class Employee
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public int CompanyId { get; set; }
public virtual Company Company { get; set; }
}
public class EFTestDbContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
public DbSet<Company> Companies { get; set; }
}
For the sake of testing, I wanted to insert one company and one employee for that company with single SaveChanges call, like this:
Company company = new Company
{
Name = "Sample company"
};
context.Companies.Add(company);
// ** UNCOMMENTED FOR TEST 2
//Company company2 = new Company
//{
// Name = "Some other company"
//};
//context.Companies.Add(company2);
Employee employee = new Employee
{
Name = "Hans",
CompanyId = company.Id
};
context.Employees.Add(employee);
context.SaveChanges();
Even though I am not using navigational properties, but instead I've made relation over Id, this somehow mysteriously worked - employee was saved with proper foreign key to company which got updated from 0 to real value, which made me go ?!?! Some hidden C# feature?
Then I've decided to add more code, which is commented in the snippet above, making it to be inserting of 2 x Company entity and 1 x Employee entity, and then I got exception:
Unable to determine the principal end of the 'CodeLab.EFTest.Employee_Company' relationship. Multiple added entities may have the same primary key.
Does this mean that in cases where foreign key is 0, and there is a single matching entity being inserted in same SaveChanges transaction, Entity Framework will assume that foreign key should be for that matching entity?
In second test, when there are two entities matching the relation type, Entity Framework throws an exception as it is not able to figure out to which of the Companies Employee should be related to.