跨多个表映射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条目。
如果你想在一对一的关系中进行级联删除,你必须显式地配置它,默认情况下它是不启用的:
new EntityTypeConfiguration<TableA>()
.HasRequired(x => x.Attribute)
.WithOptional()
.WillCascadeOnDelete(true);
(TableB
也一样)
与EF的一对一关系总是共享主键关联,这意味着外键同时是主键。结果是启用了级联删除,删除了主体a.Attribute
…
MyDBContex.Attributes.Remove(a.Attribute);
…还将删除与a
和a.Attribute
(如果有的话)具有相同主键值的相关TableB
记录。如果不违反外键约束,就无法避免这种情况。