我有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'
我做错了什么?
答案 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
字的属性都将被视为该表的关键字。