1

私は、SQL Server 2008 に完全に正常にデプロイされるかなり複雑なデータ モデルを持つ Entity Framework Code First プロジェクトに取り組んでいます。

ただし、一部のローカル エンド ツー エンド テスト用に 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 ].

ManyToManyCascadeDeleteConvention私はDataContext モデル作成メソッドを無効にしたので、それが問題の原因ではありません。私が抱えている問題は、問題の関係が SQL Server 2008 データベースで問題ないように見えることです。これは、私が知る限り、通常の外部キーのように見え、逆方向に流れているものは何も見えませんが、そうではありません。より長いパスの循環参照があることは不可能です。CE が失敗し、2008 が成功する理由がわかりません。

4

2 に答える 2

3

問題は非常に簡単に解決されたことがわかりました。無効にしましたが、循環参照の問題を回避するためManyToManyCascadeDeleteConventionにも無効にする必要がありました。OneToManyCascadeDeleteConvention

于 2012-10-10T11:08:14.117 に答える
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);
    }

もちろん、これは単純な例ですが、下位レベルのエンティティに同じ原則を適用して、循環参照の原因となるカスケード削除を具体的に除外することができます。

于 2012-10-14T17:58:02.300 に答える