繁体   English   中英

与Entity Framework ASP.net MVC中的多个表的可选关系

[英]Optional relationship to more than one table in Entity Framework ASP.net MVC

我正在尝试构建一个ASP.net MVC应用程序。 我在与数据注释建立某种联系时遇到麻烦。

我有3个表,“ Overhours ,“ Accountings ,“ Vacations 每个“ Overhour记录可以有1个“ Accounting或“ Vacation记录,但这是可选的。 因此,它不必必须拥有一个。 这是我的Overhour模式:

public class Overhour
{

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int OverhourId { get; set; }

    ....

    public int? AccountingId { get; set; }
    public virtual Accounting Accounting { get; set; }

    public int? VacationId { get; set; }
    public virtual Vacation Vacation { get; set; }
}

我想删除“ Overhour记录(如果有的话)时同时删除“ Vacation和“ Accounting记录。 当我这样使用它时,级联删除将被禁用。

我尝试了这个:

public class Overhour
{

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int OverhourId { get; set; }

    ....

    public virtual Accounting Accounting { get; set; }

    public virtual Vacation Vacation { get; set; }
}

级联删除有效,但是Entity Framework创建诸如“ Accounting_AccountingId”之类的字段,这也是必需的。 那些不是必需的。

我最后尝试的是:

public class Overhour
{

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int OverhourId { get; set; }

    ....

    public int AccountingId { get; set; }
    public virtual Accounting Accounting { get; set; }

    public int VacationId { get; set; }
    public virtual Vacation Vacation { get; set; }
}

但这一次它给了我这样的错误:

在表xxx上引入FOREIGN KEY xxx约束可能会导致循环或多个级联路径。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束

我很困惑,我在做什么错?

谢谢

DELETE CASCADE不能那样工作。 如果您删除Overhour ,则也不会删除任何其他内容。 它的作用方向相反。 如果Accounting是必需的依赖项,并且您删除了附加到OverhourAccounting实例,则Overhour应该删除Overhour 如果外键可为空,则不会发生这种情况,因为它将被设置为DELETE SET NULL。 但是,无论哪种方式,删除“ Overhour都不会对“ Accounting或“ Vacation实例产生任何影响。

更新

在这种情况下,创建一对一的关系似乎很容易,因为这种关系的一侧是可选的。 所有你需要的是:

public class Overhour
{
    ...

    public int? AccountingId { get; set; } // optional
    public virtual Accounting Accounting { get; set; }
}

public class Accounting
{
    ...

    public int OverhourId { get; set; } // required
    public virtual Overhour Overhour { get; set; }
}

这样,删除Overhour也会级联并删除关联的Accounting ,因为它取决于Overhour

只有当关系的双方都需要时,事情才会变得复杂。 然后,您必须使用fluent config将一个设置为主体,将一个设置为从属,因为EF当时无法自行做出此决定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM