web-dev-qa-db-ja.com

ASP.NET MVC 4 C#Code FirstでON DELETE NO ACTIONを指定する

モデルデザインで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; }
}

ご覧のように:

  • レストランには多くのメニューがあります
  • レストランには1つのステータスがあります
  • 1つのレストランに属するメニュー
  • レストランとメニューの両方に1つのステータスがあります。 (ライブ、インビジブル、ドラフト)

当然、ステータスが削除された場合、これがすべてを台無しにするので、私は確かにカスケードしたくありません。

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.

データベース初期化子:

http://Pastebin.com/T2XWsAqk

27
Gravy

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 );

      }

}
55
Mark Oreta

FKプロパティをnull可能にすると、カスケード削除はなくなります。

public int? StatusId { get; set; }
11
Bob Yang

モデルに変更を加えた後、-Forceパラメーターを追加して移行ファイルを再生成してください。

Add-Migration MigrationName -Force

1
Ali Sakhi

これをMenuEntitiesクラス(DbContextから派生するクラス)に入れます:

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

この行をコンテキストのフィールドの最後に追加します。

.OnDelete(DeleteBehavior.Restrict);

0
Ghadir Farzaneh