2015-07-19 73 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指定,然後刪除級聯會發生。 –