Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在EF核心中设计只指向一个方向的一对一关系_C#_.net_Entity Framework Core_Ef Core 3.0 - Fatal编程技术网

C# 如何在EF核心中设计只指向一个方向的一对一关系

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;

我试图用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; 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。另一个选项是将
地址设置为一个,但这会显著改变数据库模型。