我正在尝试使用Entity Framework开发一个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; }
}
也许我需要同时做这两件事?
我很困惑,有什么想法吗?
由于
答案 0 :(得分:0)
我能够使用可选记录进行级联删除,使用它:
public class Overhour
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual Guid Id { get; set; }
}
public class Accounting
{
[ForeignKey("Overhour")]
public virtual Guid Id { get; set; }
public virtual Overhour Overhour { get; set; }
}
public class Vacation
{
[ForeignKey("Overhour")]
public virtual Guid Id { get; set; }
public virtual Overhour Overhour { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Accounting>()
.HasRequired(accounting => accounting.Overhour)
.WithOptional()
.WillCascadeOnDelete(true);
modelBuilder.Entity<Vacation>()
.HasRequired(vacation => vacation.Overhour)
.WithOptional()
.WillCascadeOnDelete(true);
}