2016-02-25 135 views
0

我试图用实体框架开发ASP.net MVC应用程序,并且在过去大约8小时内,我试图解决某些问题而没有成功。我有3个型号,OverhourAccountingVacationOverhour是父模型,一旦我们创建了Overhour,我们可以创建一个AccountingVacation记录一次。我们不需要创建一个,所以我们可以有一个Overhour而不需要AccountingVacation。重要的是,当我们删除Overhour时,我们应该删除AccountingsVacations(如果它们存在)。在实体框架中使用可选记录级联删除

我先使用代码,我试着用数据注解,但它似乎当你不能用可选模型做到这一点,所以我现在使用Fluent Api。下面是我使用关系的OverhourAccounting之间的事:

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

我能得到级联可选配记录删除使用这个工作:

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); 
} 
+0

这里是东西,会计并不需要有一个Overhour记录。这也是可选的。所以当我尝试使用你给的代码时,我得到了一个错误,像'级联外键'FK_dbo.Accountings_dbo.Overhours_AccountingId'不能被创建,其中引用列'Accountings.AccountingId'是一个标识列。 – Dolmakalem

+0

根据[this](https://msdn.microsoft.com/en-us/data/jj591620#CascadeDelete),如果外键字段为空,那么当主体被删除时,该外键的外键字段将被设置为空;该依赖关系不会被删除。我不知道如何使外键字段不可为空和可选。 – erli

+0

是的,我认为我想要做的事是不可能的,因为双方都是可选的。我会只使用自定义代码。谢谢。 – Dolmakalem

相关问题