1

Userドメイン モデルに、構成設定のリストを含むオブジェクトがあります。次のようになります。

public class User
{
    public int ID { get; set; }

    /* various user properties */

    public List<ConfigurationSetting> Settings { get; set; }
}

構成設定には次の定義があります。

public class ConfigurationSetting
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
    public MasterAccount Account { get; set; }
}

ご覧のとおり、構成クラスには逆ナビゲーション プロパティはありません。これは、設定が にアタッチされ、MasterAccountオプションで に適用されるUserため、マッピング テーブルが必要になるためです。

UserConfiguration次のように、構成で関係を作成しようとしています。

            HasMany(x => x.Settings)
            .WithMany()
            .Map(m =>
            {
                m.ToTable("MapUserSettings");
                m.MapLeftKey("UserId");
                m.MapRightKey("SettingId");
            });

ID の名前は次のように変更されることに注意してください。

        HasKey(x => x.ID);
        Property(x => x.ID)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
            .HasColumnName("UserId");

EF Code First がモデルを作成しようとすると、次のようになります。

'FK_dbo.MapUserSettings_dbo.Settings_SettingId' on table 'MapUserSettings' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

カスケードを正しく構成するにはどうすればよいですか?

4

1 に答える 1

2

あなたが提供した情報を考慮して問題を再現しようとしましたが、モデルの構築について EF に文句を言うことはできません。

あなたが提供しなかったことの 1 つは の定義でしたMasterAccount。そのため、循環依存を引き起こしている何らかの関係がそこにコード化されていると信じなければなりません。

問題が単に1 つまたはすべてのリレーションシップのカスケード削除を望まないということである場合は、追加することで Fluent API を使用して無効にすることができます。

.WillCascadeOnDelete(false)

関係の構成に。例えば:

   modelBuilder.Entity<User>()
        .HasMany(x => x.Settings)
        .WithRequired()
        .WillCascadeOnDelete(false)

以下は、私の環境で正常に動作するようにコード化したものです。

public class User
{
    public int ID { get; set; }

    /* various user properties */

    public List<ConfigurationSetting> Settings { get; set; }
}

public class ConfigurationSetting
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
    public MasterAccount Account { get; set; }
}

public class MasterAccount
{
    public int ID { get; set; }
    public List<ConfigurationSetting> Settings { get; set; }
    public User User { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<MasterAccount> MasterAccounts { get; set; }
    public DbSet<ConfigurationSetting> Settings { get; set; }
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
                .HasKey(x => x.ID);

        modelBuilder.Entity<User>()
            .Property(x => x.ID)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
            .HasColumnName("UserId");

        modelBuilder.Entity<User>()
            .HasMany(x => x.Settings)
            .WithMany()
            .Map(m =>
             {
                 m.ToTable("MapUserSettings");
                 m.MapLeftKey("UserId");
                 m.MapRightKey("SettingId");
             });

        base.OnModelCreating(modelBuilder);
    }
}
于 2013-06-18T02:02:55.503 に答える