2013-10-30 45 views
1

我有一個產品類:實體框架一到一個有一個是可選的關係拋出錯誤

public class Product 
{ 
    public int ID { get; set; } 

    [Required] 
    public string Name { get; set; } 
    public decimal Price { get; set; } 

    public Offer Offer { get; set; } 
} 

和報價類:

public class Offer 
{ 
    public int ID { get; set; } 

    [Required] 
    public DateTime DateFrom { get; set; } 
    public DateTime DateTo { get; set; } 
    public decimal OfferPrice { get; set; } 
    public Product Product { get; set; } 
} 

基本上想我要實現的是,當報價中添加了與此優惠相關的產品。因此,優惠總是有產品,但產品並不總是需要優惠。如果產品確實有一個我希望能夠通過Product.Offer訪問它,但在此設置,我得到更新數據庫時出現以下錯誤信息:

Unable to determine the principal end of an association between the types 'WebshopISEC.Models.Offer' and 'WebshopISEC.Models.Product'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

我已經嘗試了很多東西(數據註釋和Fluent API)並且無休止地搜索,但我似乎無法解決此問題。我嘗試過的流利的API方法:

modelBuilder.Entity<Offer>() 
      .HasRequired(x => x.Product) 
      .WithOptional(x => x.Offer); 

但是,這工作無濟於事,我該如何分配一個Principal End?和什麼課程?

回答

2

試試這個:

public class Product 
{ 
    public int ID { get; set; } 

    [Required] 
    public string Name { get; set; } 
    public decimal Price { get; set; } 

    public Offer Offer { get; set; } 
} 

public class Offer 
{ 
    [ForeignKey("Product")] 
    public int ID { get; set; } 

    [Required] 
    public DateTime DateFrom { get; set; } 
    public DateTime DateTo { get; set; } 
    public decimal OfferPrice { get; set; } 
    public Product Product { get; set; } 
} 
+1

感謝您的回覆!這會引發以下錯誤:'''「錯誤:新名稱'ID'已經被用作COLUMN名稱,並且會導致不允許的重複。'''' – Mirage

+1

你可以嘗試刪除你的數據庫然後更新數據庫? – WannaCSharp

+0

我已經通過服務器資源管理器手動刪除所有表,現在我似乎無法讓我的表回來..我如何重置遷移歷史,並讓它創建一個基於我當前類的全新數據庫? – Mirage

1

當你有一個一到一個關係,一個實體必須委託人和其他人必須是相關的。在這種情況下,我建議你,以確保產品編號是FK和PK的發售,通過使用數據anotations就像這樣:

public class Product 
    { 
     public int ID { get; set; } 
     [Required] 
     public string Name { get; set; } 
     public decimal Price { get; set; } 
     public Offer Offer { get; set; } 
    } 

    public class Offer 
    { 
     public int ID { get; set; } 
     [Required] 
     public DateTime DateFrom { get; set; } 
     public DateTime DateTo { get; set; } 
     public decimal OfferPrice { get; set; } 
     [Required] 
     public Product Product { get; set; } 
    } 

在另一方面,你更瞭解你的項目,但我也會推薦你使用1:N關係。希望它的工作。

+0

Hey Guillelon,謝謝你的回覆。我嘗試了在你的答案中描述的變化,但是這導致了一個不同的錯誤:''錯誤:新名稱'ID'已經被用作一個COLUMN名字,並且會導致不允許的副本。 ' – Mirage

+0

如果您使用的是代碼優先遷移,請從數據庫中刪除包含名爲「__MigrationHistory」的表,並刪除項目中的所有遷移。然後再次創建遷移並運行update-database。 –

0

我對於一對多關係有類似的錯誤信息。 我忘記了在父屬性上顯式使用ForeignKey屬性。 然後,當我嘗試添加屬性時,我得到了一個無法運行的遷移。 我能夠通過編輯遷移來解決錯誤

public override void Up() 
{ 

    //DropIndex("dbo.PurchaseManifestLines", new[] { "PurchaseOrderLineId" }); 
    //RenameColumn(table: "dbo.PurchaseManifestLines", name: "PurchaseOrderLineId", newName: "PurchaseOrderLine_Id1"); 
    //AddColumn("dbo.PurchaseManifestLines", "PurchaseOrderLine_Id", c => c.Int(nullable: false)); 
    //AlterColumn("dbo.PurchaseManifestLines", "PurchaseOrderLine_Id1", c => c.Int()); 
    //CreateIndex("dbo.PurchaseManifestLines", "PurchaseOrderLine_Id1"); 
    // gives error Column names in each table must be unique. Column name 'PurchaseOrderLine_Id' in table 'dbo.PurchaseManifestLines' is specified more than once. 


    //replaced with 
    DropIndex("dbo.PurchaseManifestLines", new[] { "PurchaseOrderLineId" }); 
    DropColumn("dbo.PurchaseManifestLines", "PurchaseOrderLineId"); 

} 
+0

我也遇到了Code-First的情況,這是通過從代碼中刪除業務類,創建遷移來刪除表並運行它,然後恢復業務對象代碼並創建遷移以重新創建表來解決的。然後運行它。 –

相關問題