モデルデザインでON DELETE NO ACTION外部キー制約を指定するにはどうすればよいですか?
現在、私は持っています:
public class Status
{
[Required]
public int StatusId { get; set; }
[Required]
[DisplayName("Status")]
public string Name { get; set; }
}
public class Restuarant
{
public int RestaurantId { get; set; }
[Required]
public string Name { get; set; }
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
public string Telephone { get; set; }
[Required]
public int StatusId { get; set; }
public List<Menu> Menus { get; set; }
// NAVIGATION PROPERTIES
public virtual Status Status { get; set; }
}
public class Menu
{
public int MenuId { get; set; }
[Required]
public int RestaurantId { get; set; }
[Required]
public string Name { get; set; }
[Required]
public int StatusId { get; set; }
// NAVIGATION PROPERTIES
public virtual Status Status { get; set; }
public virtual Restaurant Restaurant { get; set; }
}
そして私のDbContext:
public class MenuEntities : DbContext
{
public DbSet<Status> Statuses { get; set; }
public DbSet<Restaurant> Restaurants { get; set; }
public DbSet<Menu> Menus { get; set; }
}
ご覧のように:
当然、ステータスが削除された場合、これがすべてを台無しにするので、私は確かにカスケードしたくありません。
UPDATE:
マーク・オレタは、以下の彼の例で以下を使用することに言及しています:
modelBuilder.Entity<FirstEntity>()
.HasMany(f => f.SecondEntities)
.WithOptional()
.WillCascadeOnDelete(false);
このコードはどこに置きますか? MenuEntities/DbContextクラス内で?誰かがこれが使用されている例を提供できますか?
UPDATE:現在このビットは機能していますが、DBをシードしようとすると多重度制約エラーが発生しました...
Multiplicity constraint violated. The role 'Menu_Status_Source' of the relationship 'LaCascadaWebApi.Models.Menu_Status' has multiplicity 1 or 0..1.
データベース初期化子:
OnModelCreatingメソッドのカスケード削除規則を削除することにより、コンテキスト全体で無効にすることができます。
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}
または、流perなマッピング(OnModelCreatingでも)を使用して関係ごとに実行できます。
編集:メニューエンティティに配置します
public class MenuEntities : DbContext
{
public DbSet<Status> Statuses { get; set; }
public DbSet<Restaurant> Restaurants { get; set; }
public DbSet<Menu> Menus { get; set; }
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Entity<Menu>()
.HasRequired( f => f.Status )
.WithRequiredDependent()
.WillCascadeOnDelete( false );
modelBuilder.Entity<Restaurant>()
.HasRequired( f => f.Status )
.WithRequiredDependent()
.WillCascadeOnDelete( false );
}
}
FKプロパティをnull可能にすると、カスケード削除はなくなります。
public int? StatusId { get; set; }
モデルに変更を加えた後、-Forceパラメーターを追加して移行ファイルを再生成してください。
Add-Migration MigrationName -Force
これをMenuEntities
クラス(DbContext
から派生するクラス)に入れます:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}
この行をコンテキストのフィールドの最後に追加します。
.OnDelete(DeleteBehavior.Restrict);