2014-02-16 122 views
0

我有2種型號,任務,並提供:EF代碼首先要一對多的關係

public class Task 
    { 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int id { get; set; } 
     [Key] 
     public Guid TaskId { get; set; } 
     public virtual ICollection<Offer> Offers { get; set; } 

    } 

    public class Offer 
    { 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int id { get; set; } 
     [Key] 
     public Guid OfferId { get; set; } 
     public Guid TaskId { get; set; } 
     [ForeignKey("TaskId")] 
     public virtual Task Task { get; set; } 


    } 

一個任務可以有很多的優惠,以及1個報價有一個任務,我認爲這shopuld是相當直接的,但我遇到了不同的麻煩,谷歌上搜索了幾個小時後,我發現我不得不使用流利的映射,這是我做的:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Offer>().HasRequired(p => p.Task).WithMany(c => c.Offers).HasForeignKey(e=>e.TaskId2).WillCascadeOnDelete(false); 
} 

,但現在我不能擺脫這種錯誤的:

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_dbo.Offers_dbo.Tasks_TaskId". The conflict occurred in database "test", table "dbo.Tasks", column 'TaskId'

我在做什麼錯?

+0

我同意你不應該需要流利的API來做一個簡單的一對多。 dataannotations配置中的「我碰到了不同的麻煩」是什麼意思?另外,什麼是TaskId2? – danludwig

回答

4

您不一定需要通過Fluent API進行任何設置。

您應該通過刪除下面的代碼好:

modelBuilder.Entity<Offer>().HasRequired(p => p.Task).WithMany(c => c.Offers).HasForeignKey(e=>e.TaskId2).WillCascadeOnDelete(false); 

並改變你的Task實體如下:

public class Task{ 
    private ICollection<Offer> _offers; 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Key] 
    public Guid TaskId { get; set; } 
    public virtual ICollection<Offer> Offers { 
     get { return _offers = _offers ?? new HashSet<Offer>(); } 
     set { _offers = value; } 
    } 
} 

而且還需要從Offer實體刪除public Guid TaskId { get; set; }public int id { get; set; }。任何擁有id單詞的房產都將被視爲表格的關鍵字。

+0

它讓我進一步,現在我得到這個錯誤:指定表'優惠'的多個標識列。每個表只允許有一個標識列。據我瞭解谷歌搜索,在我的優惠tabel自動生成試圖設置TaskId和OfferId作爲主鍵。如何解決它?基於EF轉換的 – Timsen

+0

,任何包含字母「id」的「Property」都將被視爲表格的關鍵字。所以刪除'public int id'或'public guid taskId'。對不起,在我的答案中錯過了這個,我會編輯答案。 – Zafar

+0

如果我從優惠中刪除taskId,我如何根據特定的任務ID選擇優惠?那是我現在唯一缺少的東西。 – Timsen