使用实体框架

时间:2016-02-25 01:06:58

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

我正在尝试使用Entity Framework开发一个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; }
}

也许我需要同时做这两件事?

我很困惑,有什么想法吗?

由于

1 个答案:

答案 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);
}