我有两个涉及一对多关系的实体:
public class Voter
{
// VoterID and CountyID define a unique primary key
public int VoterID {get;set;}
public int CountyID {get;set;}
public ICollection<Contact> Contacts {get;set;}
}
public class Contact
{
public int ID {get;set;}
public string Data {get;set;}
// VoterID and CountyID define a unique foreign key
public int VoterID {get;set;}
public int CountyID {get;set;}
public Voter Voter {get;set;}
}
复合主键和外键关系在Context.OnModelCreating()中定义如下:
builder.Entity<Voter>().HasKey( x => new { x.CountyID, x.VoterID } );
// one to many relationship: voter -> contact
builder.Entity<Voter>()
.HasMany( v => v.Contacts )
.WithOne( c => c.Voter )
.HasForeignKey( c => new { c.CountyID, c.VoterID } );
builder.Entity<Contact>()
.HasOne( c => c.Voter )
.WithMany( v => v.Contacts )
.HasForeignKey( c => new { c.CountyID, c.VoterID } );
如果我尝试将新的联系人直接添加到“联系人”表,请按以下方式添加:
_context.Contacts.Add(new Contact() {
VoterID = ...,
CountyID = ...,
Data = ....,
});
或者像这样:
Voter voter = _context.Voters.Single(...);
_context.Contacts.Add(new Contact() {
Voter = voter,
Data = ....,
});
记录没有添加。没有错误,没有例外,只是一个无声的失败。
但是,从Voter实例添加新的联系人可以:
Voter voter = _context.Voters.Include(v=>v.Contacts).Single(...);
voter.Contacts = voter.Contacts ?? new List<Contact>();
voter.Contacts.Add( new Contact() {
Voter = voter,
Data = ....,
});
我不明白为什么要从&#34;一个&#34;添加新实体?一边工作,但是从&#34;很多&#34;方并没有。
修改
在回顾这篇文章时,我意识到,在简化模型时,我可能无意中遗漏了一个重要的事实:主键,因此Contact中的外键是复合的。我已更新问题以包含这些元素。