我试图用实体框架开发ASP.net MVC应用程序,并且在过去大约8小时内,我试图解决某些问题而没有成功。我有3个型号,Overhour
,Accounting
和Vacation
。 Overhour
是父模型,一旦我们创建了Overhour
,我们可以创建一个Accounting
或Vacation
记录一次。我们不需要创建一个,所以我们可以有一个Overhour
而不需要Accounting
或Vacation
。重要的是,当我们删除Overhour
时,我们应该删除Accountings
和Vacations
(如果它们存在)。在实体框架中使用可选记录级联删除
我先使用代码,我试着用数据注解,但它似乎当你不能用可选模型做到这一点,所以我现在使用Fluent Api。下面是我使用关系的Overhour
和Accounting
之间的事:
modelBuilder.Entity<Overhour>()
.HasOptional<Accounting>(s => s.Accounting)
.WithOptionalPrincipal()
.WillCascadeOnDelete(true);
即使我使用CodeFirst,我使用插件来创建用于测试的模型图和模型看起来也没关系(我猜):
Diagram(看来我不能直接包含在图像)
按照我的理解,它“瀑布上End1Delete”说。因此,当我删除Overhour
时,会计记录也应该被删除,但它不起作用,它只是将其设置为空。
另一件事是,我不知道哪一个是父母。我的意思是,我应该有一个Overhour
模式是这样的:
class Overhour {
...
public int AccountingId { get; set; }
public virtual Accounting Accounting { get; set; }
}
或者是这样的:
class Overhour {
...
public virtual Accounting Accounting { get; set; }
}
也许我应该包括这个属性会计模型?像这样:
class Accounting {
...
public virtual Overhour Overhour { get; set; }
}
也许我需要两个都做?
我很困惑,有什么想法?
感谢
这里是东西,会计并不需要有一个Overhour记录。这也是可选的。所以当我尝试使用你给的代码时,我得到了一个错误,像'级联外键'FK_dbo.Accountings_dbo.Overhours_AccountingId'不能被创建,其中引用列'Accountings.AccountingId'是一个标识列。 – Dolmakalem
根据[this](https://msdn.microsoft.com/en-us/data/jj591620#CascadeDelete),如果外键字段为空,那么当主体被删除时,该外键的外键字段将被设置为空;该依赖关系不会被删除。我不知道如何使外键字段不可为空和可选。 – erli
是的,我认为我想要做的事是不可能的,因为双方都是可选的。我会只使用自定义代码。谢谢。 – Dolmakalem