1

我在實體框架代碼優先項目,該項目具有部署SQL Server上絕對沒問題相當複雜的數據模型的工作2008年的SQL Server CE標識與實體框架代碼首先循環引用,但SQL Server 2008不

然而,當創建一些地方的終端到終端的測試,我得到了以下錯誤消息的SQL Server CE數據庫時,EF創建數據庫:

System.Data.SqlServerCe.SqlCeException: The referential relationship will result in a cyclical reference that is not allowed. [ Constraint name = FK_Sites_Persons_PersonId ].

我在我的DataContext模型創建方法禁用ManyToManyCascadeDeleteConvention ,所以這不是th的原因問題。我遇到的麻煩是在SQL Server 2008數據庫中,有問題的關係看起來很好 - 它似乎是一個普通的外鍵,我可以看出,我看不到任何東西在另一個方向上回流,雖然它不是不可能有一個更長路徑的循環引用。我不知道爲什麼CE會失敗,2008年會成功。

+0

將您的FK定義爲可空。按照慣例,實體框架爲不可空的外鍵啓用級聯刪除。 – VahidN

回答

3

事實證明,問題很簡單地解決 - 雖然我已禁用ManyToManyCascadeDeleteConvention我還需要禁用OneToManyCascadeDeleteConvention以避免循環引用問題。

2

您也可以考慮明確定義級聯更新和刪除,而不是全局禁用它們。假設一個模型:在您的上下文

namespace Models 
{ 
    public class Parent 
    { 
     public Parent() { this.Children = new HashSet<Child>(); } 

     public int id { get; set; } 
     public string description { get; set; } 

     public ICollection<Child> Children { get; set; } 
    } 

    public class Child 
    { 
     public int id { get; set; } 
     public string description { get; set; } 

     public Parent Parent { get; set; } 
    } 
} 

覆蓋的OnModelCreating和使用流暢的API來指定一個給定的關係級聯選項。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Parent>().HasMany<Child>(p => p.Children).WithRequired(c => c.Parent).WillCascadeOnDelete(false); 

     base.OnModelCreating(modelBuilder); 
    } 

當然,這是一個簡單的例子,但可以採用同樣的原則,以你的下級實體和特別排除級聯刪除會導致循環引用。

+0

謝謝,這是一個很好的答案 - 由於我使用的EF配置稍微有點古怪,但對於我來說這並不完美,但對於未來的人來說,我懷疑這將是一個更完整的解決方案。 – glenatron

相關問題