C# 如何在EF核心中设计只指向一个方向的一对一关系
我试图用EF Core 3设计一个非常简单的数据库模型,但我在非常简单的关系上遇到了问题 我有三类:客户、文档和地址C# 如何在EF核心中设计只指向一个方向的一对一关系,c#,.net,entity-framework-core,ef-core-3.0,C#,.net,Entity Framework Core,Ef Core 3.0,我试图用EF Core 3设计一个非常简单的数据库模型,但我在非常简单的关系上遇到了问题 我有三类:客户、文档和地址 public class Customer { public int Id { get; set; } public Address Address { get; set; } } public class Document { public int Id { get; set; } public Address Address { get;
public class Customer
{
public int Id { get; set; }
public Address Address { get; set; }
}
public class Document
{
public int Id { get; set; }
public Address Address { get; set; }
}
public class Address
{
public int Id { get; set; }
public string Street { get; set; }
public string City { get; set; }
}
所以我想在不同的实体中使用通用地址
我试图用以下方式对其进行建模:
public void Configure(EntityTypeBuilder<Customer> builder)
{
builder.HasKey(f => f.Id);
builder.HasOne(f => f.Address).WitMany().IsRequired().OnDelete(DeleteBehavior.Cascade);
}
public void Configure(EntityTypeBuilder<Document> builder)
{
builder.HasKey(f => f.Id);
builder.HasOne(f => f.Address).WitMany().IsRequired().OnDelete(DeleteBehavior.Cascade);
}
public void Configure(EntityTypeBuilder<Address> builder)
{
builder.HasKey(f => f.Id);
builder.Property(f => f.Street);
builder.Property(f => f.City);
}
public void配置(EntityTypeBuilder)
{
builder.HasKey(f=>f.Id);
builder.HasOne(f=>f.Address).WitMany().IsRequired().OnDelete(DeleteBehavior.Cascade);
}
公共void配置(EntityTypeBuilder)
{
builder.HasKey(f=>f.Id);
builder.HasOne(f=>f.Address).WitMany().IsRequired().OnDelete(DeleteBehavior.Cascade);
}
公共void配置(EntityTypeBuilder)
{
builder.HasKey(f=>f.Id);
建筑商财产(f=>f.Street);
建筑商财产(f=>f.City);
}
但问题是,当我的文档附带了一个地址,并且我试图删除该文档时,该地址将不会被删除。由于某种原因,地址是文件的主要部分
如何建立这种关系的模型?我不能在地址实体中使用导航属性,因为地址可以在多个不同实体中用作地址的通用表示。谢谢Ivan指出这是不可能的。我将按照Gerd的建议使用自有类型。从实体中删除
DeleteBehavior.Cascade
。这对共享实体不起作用。您需要的是onDelete:ReferentialAction.SetNull
,并在删除文档之前将对文档的所有引用设置为null。但它能否解决在删除文档后不删除地址的问题?当我调用dbContext.Remove(document)时,我希望它自动删除附加到它的document.Address实体。您不能删除它,因为Address
附加到客户
。在此实例中不要使用级联删除。第一步。将地址的每个引用设置为空。第二步。删除地址
。第三步。删除文档
。这在关系数据库中是不可能的,因此在EF(核心或非核心)中是不可能的<代码>地址
可以配置为仅与单个主体实体一对一的从属方。但您希望在多个实体中使用它,因此PK不能用作FK。唯一的方法是创建2个(或N个)互斥的FK。另一个选项是将地址设置为一个,但这会显著改变数据库模型。