簡體   English   中英

需要一個ASP MVC數據庫專家來正確初始化關系

[英]Need an ASP MVC database guru to properly initialize relationships

客戶與地址之間存在一對一的關系。 根據我的理解,我必須修改一下我擁有的OnModelCreating方法。 現在,我准備好讓我的應用程序運行了,但是我需要正確地初始化數據庫。 但我遇到了錯誤。

主要計划是先創建一個客戶端,然后再創建一個與之關聯的地址。

這是我的上下文類:

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約束。 無法創建約束。 請參閱先前的錯誤。

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

只要看看你的數據模型,那豈不是更有意義刪除客戶端,如果他/她的地址被刪除(人把所有的時間:-))。 還是有一個原因為什么刪除地址也應該抹去客戶端(畢竟,您的數據模型確實說地址是可選的...。)

如果您注釋掉以下行:

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

,或將WillCascadeOnDelete設置為false,是否可行?

另一種選擇是完全關閉級聯刪除約定。

   modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

但我不認為那是您要在這里做的...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM