与实体框架ASP.net MVC

时间:2016-02-24 18:49:21

标签: c# asp.net asp.net-mvc entity-framework orm

我正在尝试构建一个ASP.net MVC应用程序。我无法与数据注释建立某种关系。

我有3个表,OverhoursAccountingsVacations。每条Overhour条记录都可以包含1条AccountingVacation条记录,但这是可选的。所以,它不需要有一个。这是我的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; }
}

我希望在删除Vacation记录时删除AccountingOverhour记录(如果有的话)。当我像这样使用它时,级联删除被禁用。

我试过了:

public class Overhour
{

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

    ....

    public virtual Accounting Accounting { get; set; }

    public virtual Vacation Vacation { get; set; }
}

级联删除有效,但实体框架会创建“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约束

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

由于

1 个答案:

答案 0 :(得分:0)

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

<强>更新

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

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

当需要双方关系时,事情变得复杂。然后,您必须使用fluent配置将一个设置为主体,将一个设置为依赖,因为此时EF无法自行做出此决定。