单向一对一关系实体框架,级联删除不起作用

Dum*_*ore 7 c# entity-framework-6

我想实现一对一的单向关系; 但是在级联删除不起作用.

我有以下课程:

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public string Street { get; set; }
    //I don't want the StudentId foreign key or the property of Student class here 
}
Run Code Online (Sandbox Code Playgroud)

在我的Context类中,我正在映射这样的关系:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
        .HasRequired(s => s.Address)
        .WithOptional()
        .Map(m => m.MapKey("Address_Id"))
        .WillCascadeOnDelete();
}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,它不会删除address何时student删除对象.

此外,我还想在类中添加外键属性(即AddressId),Student如下所示:

[ForeignKey("Address")]
[Column("Address_Id")]
public string AddressId { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试添加新迁移时出现此错误:

Address_Id:Name:类型中的每个属性名称必须是唯一的.已定义属性名称"Address_Id".

我确实相信我正在混淆(有MapKey和属性AddressId).但是,我不知道如何解决这个问题.


我经历了这个问题这篇文章 ; 然而,到目前为止没有运气.

链接到DotNetFiddle.它不起作用,因为没有数据库.

Iva*_*oev 3

address由于某种原因,当对象被删除时,它不会被删除student

这是您定义的关系的正常行为。这不是数据注释或流畅配置的问题。如果您有不同的期望,您最好重新审视您的模型。

每个关系都有一侧称为“主体”,另一侧称为“从属”。主(又称主方、主要方)是被引用的一方。从属方(又名细节、次要)是引用主体的一方。外键放置在从属端,并且必须始终指向现有主体null当关系为 时optional。其工作原理是在删除 记录时cascade delete删除所有从属记录。

正如代码首先如何确定关联中的主要目标和从属目标中所解释的那样?您提到的文章部分中,EF 始终使用required一边作为主体,并且仅当两者都是 时才允许您选择一侧required

说了这么多,让我们看看你有什么。

Address伊斯兰required国。Studentoptional另外你想把FK放进去Student,即Student参考文献Address

所有这一切都意味着,在你们的关系中,Address主体Student也是从属。这意味着Address可能存在而不Student引用它。如果cascade delete打开(就像您所做的那样),删除Address将会删除Student,而不是相反。

我认为所有这些都应该解释为什么它现在这样工作,并且没有任何属性或配置可以帮助实现您所要求的。如果您有不同的需求,同一篇文章(以及同一系列的相关文章)解释了如何配置关系以在地址端使用共享主键关联外键关联。无论是单向还是双向,都与问题毫无共同之处 - 请参阅文章中的部分。Should We Make the Associations Bidirectional?