【问题标题】:code first composite key made of foreign keys ef 4.3由外键 ef 4.3 组成的代码优先复合键
【发布时间】:2012-03-14 22:31:50
【问题描述】:

我首先在 EF 4.3 代码中创建由外键组成的复合键时遇到问题。我想通过数据注释来解决这个问题。我找不到正确的数据注释,表明 EventID 是事件的外键,并且是 EventVote 表中主键的一部分。我如何做到这一点

   public class EventVote
{

    [Key, Column(Order = 0)]
    [ForeignKey("Event")]
    public int EventID { get; set; }

    [Key, Column(Order = 1)]
    [ForeignKey("User")]
    public int UserID { get; set; }

    [Required]
    public DateTime VoteTime { get; set; }

    [Required]
    public bool Vote { get; set; }



    public virtual Event Event { get; set; }
    public virtual User User { get; set; }
}

错误 在表“EventVotes”上引入 FOREIGN KEY 约束“EventVote_User”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。 无法创建约束。查看以前的错误。

【问题讨论】:

  • 错误信息,或者说明什么实际上不起作用?
  • 发布EventUser 类的代码
  • 更新了答案,其中包含可能有帮助的链接。数据注释是有限的,有时您必须使用 FluentAPI。有一个部分专门处理您遇到的错误。

标签: c# ef-code-first code-first


【解决方案1】:

试试这个。您也可以将 ForeignKey 注释放在导航属性上并引用 FK 的名称。不确定它是否能解决您的问题,但值得一试 IMO

public class EventVote
{

    [Key, Column(Order = 0)]
    public int EventID { get; set; }

    [Key, Column(Order = 1)]
    public int UserID { get; set; }

    [Required]
    public DateTime VoteTime { get; set; }

    [Required]
    public bool Vote { get; set; }


    [ForeignKey("EventID")]
    public virtual Event Event { get; set; }
    [ForeignKey("UserID")]
    public virtual User User { get; set; }
}

编辑:从您的错误消息看来,您遇到的问题类似于一对一关系映射所发生的问题。请参阅这篇文章,了解如何指定使用 fluent API 在每个关系的一侧禁用级联。

请参阅解决此问题的这篇文章。请注意,他们使用的是 Fluent API,它可以用来代替数据注释来指定您的映射/关系,或者您可以使用数据注释并仅在必要时使用 Fluent API 来关闭级联/更新。

http://weblogs.asp.net/manavi/archive/2011/05/01/associations-in-ef-4-1-code-first-part-5-one-to-one-foreign-key-associations.aspx

【讨论】:

  • 我最终混合使用了数据注释和级联删除和更新。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-02-13
  • 2011-07-24
  • 2018-05-31
  • 2012-01-13
  • 1970-01-01
  • 2011-12-12
相关资源
最近更新 更多