2013-03-05 54 views
0

我在客戶端和地址之間有一對一的關係。根據我的理解,我必須修補我所擁有的OnModelCreating方法。現在我準備好給我的應用程序了,但我需要正確初始化我的數據庫;但我得到一個錯誤。需要一個ASP MVC數據庫大師來正確初始化關係

主要計劃是首先創建一個客戶端,然後創建一個地址與之關聯。

這裏是我的上下文類:

public class VolumeV2Context : DbContext 
{ 
    public DbSet<GiftCard> GiftCards { get; set; } 
    public DbSet<Clients> Clients { get; set; } 
    public DbSet<Address> Address { get; set; }    

     // use if you need to drop the database 
     static VolumeV2Context(){ 

    // use if need to reset the models 
    // Database.SetInitializer(new DropCreateDatabaseIfModelChanges<VolumeV2Context>()); 

    // use to reset whole database tables 
     Database.SetInitializer(new DropCreateDatabaseAlways<VolumeV2Context>()); 

    } 


    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Clients>() 
      .HasOptional(j => j.Address) 
      .WithOptionalDependent() 
      .WillCascadeOnDelete(true); 

     modelBuilder.Entity<Address>() 
      .HasRequired(j => j.client) 
      .WithRequiredDependent() 
      .WillCascadeOnDelete(true) ;       


     base.OnModelCreating(modelBuilder); 
    } 
} 

模式

public class Address 
{ 
    [Required] 
    public int Id { get; set; } 

    [DataType(DataType.Text)] 
    [Display(Name = "Street Address")] 
    public string StreetAddress { get; set; } 

    [DataType(DataType.Text)] 
    [Display(Name = "Postal Code")] 
    public string PostalCode { get; set; } 

    [DataType(DataType.Text)] 
    public string City {get; set; } 

    [DataType(DataType.Text)] 
    public string Province {get; set;} 

    public virtual Clients client { get; set; } 

} 
public class Clients 
{ 
    [Required] 
    public long Id { get; set; } 

    [Required] 
    [DataType(DataType.Text)] 
    [Display(Name = "First Name")] 
    public string FirstName { get; set; } 

    [Required] 
    [DataType(DataType.Text)] 
    [Display(Name = "Last Name")] 
    public string LastName { get; set; } 

    [Required] 
    [DataType(DataType.PhoneNumber)] 
    [Display(Name = "Phone ")] 
    public string PhoneNumber { get; set; } 

    public virtual Address Address {get; set;} 

    [Display(Name = "Email List")] 
    public Boolean EmailList { get; set; } 

    [DataType(DataType.EmailAddress)] 
    [Display(Name = "E-mail")] 
    public string Email { get; set; } 

    [DataType(DataType.Text)] 
    [Display(Name = "Hair Type")] 
    public string HairType { get; set; }   

    [DataType(DataType.MultilineText)] 
    public string Description { get; set; } 
} 

在我第一次調用數據庫,這是在主索引方法

return View(db.Clients.Take(25).ToList()); 

它返回錯誤說:

上表將外鍵約束 「FK_dbo.Addresses_dbo.Clients_client_Id」「地址」可以 原因循環或多個級聯路徑。指定ON DELETE NO ACTION或 ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。 不能創建約束。查看以前的錯誤。

回答

3

問題是您有雙向級聯刪除。換句話說,刪除一個客戶端將刪除一個地址,這將刪除一個客戶端,這將刪除一個地址...你得到的圖片。

只是看着你的數據模型,它不會更有意義而不是刪除客戶端,如果他/她的地址被刪除(人們一直移動:-))。或者是有一個原因刪除地址也應該消滅在客戶端(畢竟,你的數據模型不說地址是可選的....)

如果行註釋掉:

modelBuilder.Entity<Address>() 
    .HasRequired(j => j.client) 
    .WithRequiredDependent() 
    .WillCascadeOnDelete(true) ;  

,或者使WillCascadeOnDelete爲false,是否有效?

另一種選擇是把級聯刪除慣例完全關閉...

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

,但我不認爲這就是你想在這裏做什麼?

+0

謝謝你的偉大的可視化,我真的需要。所以我評論了代碼,它的工作原理(這是我最初的笑話)。我擔心的真正問題是如何正確刪除客戶端並刪除他們的地址。我應該只使用我的刪除邏輯發佈另一個問題嗎? – Fpanico 2013-03-05 22:14:05

+0

那麼,在這種情況下,你保持刪除客戶端時刪除和地址的級聯刪除。只是沒有其他的方式(不要刪除一個客戶端,因爲地址被刪除。) - 或者你是否說級聯刪除不起作用?例如,你刪除了一個客戶,但地址記錄在那裏是孤兒? – GojiraDeMonstah 2013-03-05 22:34:12