跨多个表映射EF 1到0.1关系的选项

本文关键字:选项 关系 EF 映射 | 更新日期: 2023-09-27 18:03:27

我试图通过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}
}

where 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)和引用的属性。

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

导致一个异常,抱怨fk。

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

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

跨多个表映射EF 1到0.1关系的选项

如果你想在一对一的关系中进行级联删除,你必须显式地配置它,默认情况下它是不启用的:

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

(TableB也一样)

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

MyDBContex.Attributes.Remove(a.Attribute);

…还将删除与aa.Attribute(如果有的话)具有相同主键值的相关TableB记录。如果不违反外键约束,就无法避免这种情况。