2014-02-16 118 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