2012-10-13 53 views
20

如何在我的模型設計中指定ON DELETE NO ACTION外鍵約束?在ASP.NET MVC 4中指定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; } 
} 

正如你可以看到:

  • 餐廳有很多菜單
  • 餐廳有一種狀態
  • a菜單屬於1餐廳
  • 餐廳和菜單都有1個狀態。 (Live,Invisible,Draft)

當然,如果一個狀態被刪除,我當然不想級​​聯,因爲這會弄糟一切。

UPDATE:

馬克Oreta提到使用下他的例子如下:

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

回答

47

您可以通過刪除OnModelCreating方法中的級聯刪除約定來爲整個上下文禁用它:

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

,或者您可以使用流利的映射(也在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); 

     } 

} 
+0

哪裏OnModelCreating方法?我怎麼找到它? – Gravy

+0

更新了我的答案 - 但你會把它放在你的MenuEntities類中,你不需要同時刪除約定和流利的映射(選擇其中一個或另一個),但是我把它們都放到了你的頭上會使用它們。 –

+1

感謝馬克,已更新,但仍然存在問題...查看有問題的更新 – Gravy

0

將這個到你的MenuEntities班(從DbContext下降的班級):

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

對模型進行更改後,請確保通過添加-Force參數來重新生成遷移文件。

附加遷移MigrationName -Force

0

只是讓FK屬性爲空,那麼級聯刪除將不復存在。

public int? StatusId { get; set; } 
相關問題