2016-01-27 25 views
0

我有兩個三個模型:Reservation,Buyer和SalesAgent。我的應用程序所做的是,預訂可以與買方同時放置一個SalesAgent。這是我對我的模型結構:來自實體框架中的TPH的多個外鍵

預訂

public class Reservation 
{ 
    public int Id { get; set; } 

    [Required(ErrorMessage = "Enter Reservation Date.")] 
    [DataType(DataType.Date)] 
    [Display(Name = "Reservation Date")] 
    public string ReservationDate { get; set; } 

    public virtual HouseUnit HouseUnit { get; set; } 
    public int HouseUnitID { get; set; } 

    public virtual Buyer Buyer { get; set; } 
    public int BuyerID { get; set; } 

    public virtual SalesAgent SalesAgent { get; set; } 
    public int SalesAgentID { get; set; } 

} 

買家

public class Buyer 
{ 

    public int Id { get; set; } 

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

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

    [Required] 
    [Display(Name = "Middle Name")] 
    public string MiddleName { get; set; } 

    [Required(ErrorMessage = "Enter enter birth date.")] 
    [DataType(DataType.Date)] 
    [Display(Name = "Date of Birth")] 
    public string DateOfBirth { get; set; } 

    [Display(Name = "Current Address")] 
    [Required] 
    public string CurrentAddress { get; set; } 

    [Required] 
    public string Occupation { get; set; } 

    [Display(Name = "Monthly Income")] 
    [DisplayFormat(DataFormatString = "{0:n2}")] 
    public double MonthlyIncome { get; set; } 

    [Required] 
    public string Company { get; set; } 

    [Required(ErrorMessage = "Your must provide a contact number.")] 
    [Display(Name = "Contact Number")] 
    [DataType(DataType.PhoneNumber)] 
    [RegularExpression(@"^(\d{11})$", ErrorMessage = "Please enter proper contact details.")] 
    public string ContactNumber { get; set; } 

    public bool HasPlacedReservation { get; set; } 
} 

SalesAgent

public class SalesAgent : Buyer {} 

運行Update-Database時出現問題。這裏的錯誤:

Introducing FOREIGN KEY constraint 'FK_dbo.Reservations_dbo.BuyersInformations_SalesAgentID' on table 'Reservations' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

有人可以請解釋發生了什麼,以及如何解決這個問題?謝謝。

+0

你會分享'BuyersInformation'類。 –

回答

1

發生什麼事情是,你有一種情況,對象A有一個對象B的引用,它有一個對象A的引用,它引用了對象B,它...無限。這本身並不是不好的做法,但實體框架無法處理這種情況,因爲對象A和對象B相互依賴;如果刪除一個,另一個會在連鎖反應類型的效果(又名級聯)中被刪除,這可能會導致其他相關對象在反應中被刪除。實體框架要求您通過消除一個對象對另一個對象的依賴性或指示它不級聯刪除這些具有外鍵約束的對象來解決這種情況。如果您不想執行第一個選項,則必須告知實體框架不要級聯刪除這些對象。您可以在全球範圍與你的DbContext對象用下面的代碼執行此:

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

    // ... 
} 

這將指示所有一個一對多的關係不執行級聯刪除。您也可以單獨指示實體框架不級聯刪除使用以下流利的API代碼的具體項目:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // ... 

    modelBuilder.Entity<ObjectA>() 
     .HasOptional(a => a.ObjectB) 
     .WithOptionalDependent() 
     .WillCascadeOnDelete(false); 

    // ... 
} 

以上內容僅是一個例子。您的確切Fluent API代碼將與上面的代碼有所不同,具體取決於依賴關係是否可選,或者它們是一對一,一對多還是多對多。

這就是說,雖然上面的代碼可能會解決您的問題,但從長遠來看,這可能更多是一個創可貼解決方案。您的對象及其依賴關係可能存在更大的問題,值得進一步研究。

+0

感謝您爲解決此問題所做的努力。我嘗試了你的第一個解決方案,但它沒有奏效。我如何將兩個外鍵鏈接到一個表格? – Cyval

+0

使用Fluent API,以下代碼會將多對多關係映射到其自己的單獨表格:modelBuilder.Entity ().HasMany(a => a.ObjectBList).WithMany()。Map(m => {m.ToTable(「YourNewTableName」); m.MapLeftKey(「ObjectAID」); m.MapRightKey(「ObjectBID」);});' – Chase