33

このエラーが発生しています

テーブル 'Regions' に FOREIGN KEY 制約 'FK_dbo.Regions_dbo.Countries_CountryId' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。制約を作成できませんでした。以前のエラーを参照してください。

これは私のデータベース設計が悪いということでしょうか? カスケードやそのようなものをオフにすることを読みましたが、それが敷物から問題を一掃しているかどうかはわかりません.

ドメインクラスを介してEFにテーブルを生成させているだけです(この時点では、データ注釈や流暢なマッピングは使用していません)。

       public class Country
        {
            public Country()
            {
                this.Stores = new List<Store>();
                this.Regions = new List<Region>();
                Id = GuidCombGenerator.GenerateComb();
            }

            public Guid Id { get; private set; }

            private string name;

            public string Name
            {
                get { return name; }
                set
                {
                    name = value.Trim();
                }
            }

            private string code;

            public string Code
            {
                get { return code; }
                set
                {
                    code = value.Trim();
                }
            }

            public virtual ICollection<Store> Stores { get; set; }
            public virtual ICollection<Region> Regions { get; set; }
        }


          public class City
        {
            public City()
            {
                this.Stores = new List<Store>();
                Id = GuidCombGenerator.GenerateComb();
            }

            public Guid Id { get; private set; }

            private string name;

            public string Name
            {
                get { return name; }
                set
                {
                    name = value.Trim();
                }
            }


            public Guid RegionId { get; set; }
            public virtual Region Region { get; set; }

            public virtual ICollection<Store> Stores { get; set; }
        }


            public class Region
        {
            public Region()
            {
                this.Cities = new List<City>();
              this.Stores = new List<Store>();


                Id = GuidCombGenerator.GenerateComb();
            }

            public Guid Id { get; private set; }


            private string state;

            public string State
            {
                get { return state; }
                set
                {
                    state = value.Trim();
                }
            }


            public Guid CountryId { get; set; }
            public virtual ICollection<City> Cities { get; set; }
            public virtual Country Country { get; set; }
           public virtual ICollection<Store> Stores { get; set; }
        }


  public class Store
    {
        public Store()
        {
            Id = GuidCombGenerator.GenerateComb();

            Users = new List<User>();
        }

        public Guid Id { get; private set; }

        public Guid CountryId { get; set; }
        public Guid CityId { get; set; }
        public Guid RegionId { get; set; }
        public virtual City City { get; set; }
        public virtual Country Country { get; set; }
        public virtual Region Region { get; set; }

        public virtual ICollection<User> Users { get; set; }

    }

店によるのかな。

4

2 に答える 2

57

すべての外部キー プロパティ (、、) は null 許容ではないため、モデルのすべての関係が必要です。必要な 1 対多のリレーションシップの場合、EF は慣例によりカスケード削除を有効にします。CountryIdRegionIdCityId

CountryテーブルへRegionの複数の削除パスがありStoreます。たとえばCountry、関連するStores を削除する場合、3 つの異なるカスケード パスを介して削除できます (SQL Server では許可されていません)。

  • Country->Store
  • Country-> Region->Store
  • Country-> Region-> City->Store

Fluent API を使用してカスケード削除を無効にするか、一部の関係をオプションとして(null 許容の外部キーを使用してGuid?) 定義することにより、このようなあいまいな削除パスを回避する必要があります。

Storesまたは、を除くすべてのエンティティからコレクション (および逆参照と FK プロパティ) を削除しCityます。Countryコレクションをナビゲートすることですべてのストアを見つけることができるため、これらのコレクションは冗長に見えますRegions.Cities.Stores

于 2013-10-15T20:04:01.597 に答える
25

次のようにファイルのメソッドに追加modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()します。OnModelCreatingDataContext

public class YourDataContext : DbContext
{
    public DbSet<Country> Countries{ get; set; }
    ...


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

    }
}

同じ質問: entity-framework-how-to-solve-foreign-key-constraint-may-cause-cycles-or-multi

于 2014-01-04T00:31:28.357 に答える