用于在多个表之间映射EF 1到0..1关系的选项

时间:2013-03-12 17:11:15

标签: c# entity-framework

我试图通过EF poco建模以下关系:

Class TableA
{
  [Key]
  public int TableAId {get;set;}

  public Attribute Attribute {get;set;}
}

Class TableB
{
  [Key]
  public int TableBId {get;set;}

  public Attribute Attribute {get;set;}
}

Class Attribute
{
  [Key]
  public int AttributeId {get;set;}

  public string Name{get; set}
}

其中TableA和TableB都引用Attribute。

为此,我插入了以下流畅的映射:

 new EntityTypeConfiguration<TableA>().HasRequired(x => x.Attribute);
 new EntityTypeConfiguration<TableB>().HasRequired(x => x.Attribute);

一切都很好,我可以使用这种方法添加元素:

 var a = new TableA();
 var attrA = new Attribute { Name = "Table A Attribute"};
 a.Attribute = attrA;

 MyDbContext.TableAs.Add(a);
 MyDbContext.SaveChanges();

直到我想删除TableA(或B)和引用的Attribute。

 MyDBContex.TableAs.Remove(a);
 MyDBContex.Attributes.Remove(a.Attribute);

导致一个抱怨FK的异常。

我需要有哪些选项来映射和配置这种关系?

我需要插入和删除TableA和TableB对象并级联删除它们相关的属性条目。

1 个答案:

答案 0 :(得分:1)

如果您希望以一对一的关系进行级联删除,则必须明确配置它,默认情况下不启用它:

new EntityTypeConfiguration<TableA>()
    .HasRequired(x => x.Attribute)
    .WithOptional()
    .WillCascadeOnDelete(true);

TableB也一样。)

与EF的一对一关系始终是共享主键关联,这意味着外键同时是主键。结果是,启用级联删除删除主体a.Attribute ...

MyDBContex.Attributes.Remove(a.Attribute);

...还会删除与TableBa具有相同主键值的相关a.Attribute记录(如果有)。在不违反外键约束的情况下,您无法避免这种情况。