一对多关系的增加必须在EF Core的Master Side进行

时间:2016-10-20 15:18:01

标签: entity-framework entity-framework-core

我有两个涉及一对多关系的实体:

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中的外键是复合的。我已更新问题以包含这些元素。

0 个答案:

没有答案