我试图通过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对象并级联删除它们相关的属性条目。
答案 0 :(得分:1)
如果您希望以一对一的关系进行级联删除,则必须明确配置它,默认情况下不启用它:
new EntityTypeConfiguration<TableA>()
.HasRequired(x => x.Attribute)
.WithOptional()
.WillCascadeOnDelete(true);
(TableB
也一样。)
与EF的一对一关系始终是共享主键关联,这意味着外键同时是主键。结果是,启用级联删除删除主体a.Attribute
...
MyDBContex.Attributes.Remove(a.Attribute);
...还会删除与TableB
和a
具有相同主键值的相关a.Attribute
记录(如果有)。在不违反外键约束的情况下,您无法避免这种情况。