2013-10-30 115 views
2

我有兩個有問題的表。實體框架代碼表之間的前兩個關係

  • 第一張表關於用戶,並且有 - userId, username, password, etc

  • 第二個是處理消息,所以它有 - messageId, senderId, receiverId, messageContent。

正如你所看到的,senderIdreceiverId需要從用戶表相關的用戶ID。

但正如我想使用Code First,它只是崩潰。 我得到一個例外:

「將外源KEY約束 'FK_dbo.Messages_dbo.Users_ReceiverId' 上表 '消息' 可能會導致循環或多個級聯路徑指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。「

這是我是如何做到的Message類的關係:

[ForeignKey("Sender")] 
    public int SenderId { get; set; } 
    public virtual User Sender { get; set; } 

    [ForeignKey("Receiver")] 
    public int ReceiverId { get; set; } 
    public virtual User Receiver { get; set; } 

任何想法?我現在被卡住了。如果我以數據庫爲先,但它的工作原理非常好,但如果我嘗試Code First,則不會。

回答

0

在生成的.cs文件中的遷移文件夾,具有cascadeDelete: false替換cascadeDelete: true,因此,例如:

AddForeignKey("dbo.Messages", "ReceiverId", "dbo.Users", "Id", 
    cascadeDelete: true); 
AddForeignKey("dbo.Messages", "SenderId", "dbo.Users", "Id", 
    cascadeDelete: true); 

變爲:

AddForeignKey("dbo.Messages", "ReceiverId", "dbo.Users", "Id", 
    cascadeDelete: false); 
AddForeignKey("dbo.Messages", "SenderId", "dbo.Users", "Id", 
    cascadeDelete: false); 
+0

不,崩潰... –

+0

爲了記錄在案,如果我只用一個外鍵的領域之一(例如只對發送者),它完美的作品。但是,接收者字段的名稱會像「Receiver_User_UserId」一樣奇怪...... –

0

默認EF代碼首先創建級聯選項在外鍵表的刪除和更新規則中設置爲真。您可以從SQL Server管理工作室中通過右鍵單擊表的外鍵列,然後展開「插入和更新規範」來檢查它。 enter image description here

爲快速解決此問題,只需將此代碼添加到您已設置DBSet信息的DBContext.cs或YourContext.cs類。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    {    
     modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

    } 

運行從項目的包管理器控制檯窗口中的添加遷移的InitialContext命令和更新,數據庫-Verbose命令。

0

,我認爲你的答案是在這個崗位

Entity Framework 4.1 InverseProperty Attribute

它說有一個叫InverseAttrivuteProperty另一裝飾它可以幫助您確定在源表匹配哪一端的命運關係表中的哪一端。

但是,不要使用它,因爲它是解釋。我不得不讓你的裝飾器在外鍵上。

剛剛測試過它,它工作。很快我會發布一些解釋性的東西。

0

只需手動配置您的實體關係以避免與EF混淆。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{    
    modelBuilder.Entity<Message>() 
       .HasOptional(x => x.Sender) 
       .WithMany(x => x.SenderMessages); 
    modelBuilder.Entity<Message>() 
       .HasOptional(x => x.Reciever) 
       .WithMany(x => x.RecieverMessages); 

} 
相關問題