EF代码首先建立一对多的关系

时间:2014-02-16 00:25:22

标签: linq entity-framework

我有2个模型,任务和优惠:

  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个优惠有一个任务,我认为它非常直接,但我遇到了不同的麻烦,谷歌搜索几个小时后我发现我必须使用流畅的映射,我做了:

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);
} 

但现在我无法摆脱这个错误:

  

ALTER TABLE语句与FOREIGN KEY约束冲突   “FK_dbo.Offers_dbo.Tasks_TaskId”。冲突发生在数据库中   “test”,表“dbo.Tasks”,列'TaskId'

我做错了什么?

1 个答案:

答案 0 :(得分: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; }
    }
}

此外,您还需要从public Guid TaskId { get; set; }实体中删除public int id { get; set; }Offer。任何包含id字的属性都将被视为该表的关键字。