EF流畅的API c#级联删除问题

时间:2015-07-19 16:42:08

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

我在配置模型时不能级联删除。

modeL。

public class Hit
{
    public int Id { get; set; }

    // Foreign Key
    public int AccountId { get; set; }

    // Foreign Key
    public int LeadId { get; set; }

    //navigation properties
    [ForeignKey("LeadId")]
    public Lead lead { get; set; }

    //navigation properties
    [ForeignKey("AccountId")]
    public Account account { get; set; }

}

Fluent API:

 modelBuilder.Entity<Hit>()
          .HasRequired(t => t.lead)
          .WithMany()
          .HasForeignKey(t => t.LeadId)
          .WillCascadeOnDelete(false);

当我尝试迁移它时,我在Hit的创建表中得到了这个:

.ForeignKey("dbo.Accounts", t => t.AccountId, cascadeDelete: true)
.ForeignKey("dbo.Leads", t => t.Lead_Id)
.ForeignKey("dbo.Leads", t => t.LeadId, cascadeDelete: true)

我想在迁移脚本中为潜在客户和帐户实现的目标是:

.ForeignKey("dbo.Leads", t => t.LeadId)

我应该怎么做呢?它简直容易,但我对这一切都是新手:(

编辑1:

我将其添加到流畅的API中:

 modelBuilder.Entity<Lead>().HasMany(i => i.Hits).WithOptional().HasForeignKey(s=> s.LeadId).WillCascadeOnDelete(false);

删除cascadelete:.ForeignKey(&#34; dbo.Leads&#34;,t =&gt; t.LeadId)

但是,我也希望将其删除:

 .ForeignKey("dbo.Accounts", t => t.AccountId, cascadeDelete: true)

简单的解决方案是将其从迁移脚本中删除。但我想如何使用FLuent API或其他方法来做到这一点。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

就像我在上面的评论中已经说过的那样,如果您使用Fluent API映射FK,请从导航属性中删除[ForeignKey]属性。

然后你可以进行这样的非级联映射:

modelBuilder.Entity<Hit>().HasOptional(m => m.account).WithMany().HasForeignKey(m
=> m.AccountId).WillCascadeOnDelete(false);

最后,您必须检查您的FK列是可选的还是必需的,因为可选映射会将您的FK属性AccountIdLeadId更改为数据类型int?,否则您必须更改FK映射的HasOptional()部分为HasRequired()

答案 1 :(得分:0)

像这样定义你的模型:

public class Hit
{
    public int Id { get; set; }

    public virtual Lead Lead { get; set; }

    public virtual Account Account { get; set; }
}

virtual关键字将让实体框架知道您正在定义外键并自动匹配Id。

从Fluent API中删除HasRequired(t => t.lead).WithMany()部分。如果需要一个属性,没有它就不能存在,并且会在删除时级联。