2015-07-19 36 views
0

我在配置模型以不级联删除时遇到问题。EF流利的API c#级联删除问题

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; } 

} 

流利的API:

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

当我尝试迁移它,我得到这个在打造成表:

.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) 

我该如何去做这件事?它prbably容易,但我是新来的这一切:(

编辑1:

我已将此添加到流畅的API:

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

从删除cascadelete:.ForeignKey(“DBO。信息”,T => t.LeadId)

不过,我也想从中删除:

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

的易使如果将其从迁移脚本中删除。但我想用FLuent API或其他方法来做到这一点。

任何想法?

+0

如果您已经使用流利的API映射你的FKS,我建议你从你的导航属性中删除'[ForeignKey的]'属性。 –

+0

嗨弗洛里安。关于如何使用流畅的API解决我的“编辑1”的想法? – jan

+0

你可以做这样的事情:'modelBuilder.Entity ().HasOptional(M => m.account).HasForeignKey(M => m.AccountId)。WillCascadeOnDelete(假);' –

回答

1

就像我已经说过的上述评论,如果你用流利的API映射你的FKS从您的导航属性中删除[ForeignKey]属性。

然后,您可以做非级联的映射是这样的:

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

最后你要检查你的FK列应该是可选或必需的,可选的映射改变你的FK属性AccountIdLeadId数据类型int?,否则你不得不将你的FK映射的HasOptional()部分更改为HasRequired()

0

定义你的模型像这样:

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

    public virtual Lead Lead { get; set; } 

    public virtual Account Account { get; set; } 
} 

virtual关键字将让实体框架知道你要定义一个外键会自动匹配的ID。

取出HasRequired(t => t.lead).WithMany()部分来自流利的API。如果一个属性是必需的,没有它就不能存在,并且会在删除时级联。

+0

嗨,Thx为您提供帮助。 如果删除了HasRequired和withmany,并保持这样的: modelBuilder.Entity () .HasForeignKey(T => t.LeadId) .WillCascadeOnDelete(假); 然后我得到这个错误: “不包含'HasForeignKey'的定义和没有扩展方法'HasForeignKey' – jan

+0

在旁注:如果我的主要模型主键是”Id“,那么我假设所需的结果应该是: .ForeignKey( “dbo.Leads”,T => t.Id),而不是 “t.LeadId”。对不对?:)或者是我的命名约定ofhere,和主键应在型号导线来命名,而不是“ID”,“LeadId”? – jan

+0

嗨,简,不幸的是我现在不能轻易地尝试它。如果你只是保持“ID”(我觉得寻找不同性质最简单的约定),删除整个流利的API定义,并通过虚拟财产的定义外键,并且还添加属性'DbContext'定义,如果你没有已经这样做我相当肯定他们将在没有级联删除的情况下实施。如果你把'[要求]'对性能的属性,或者在它需要的属性流利的API指定,然后删除级联会发生。 –