2012-03-14 96 views
3

我在使用EF 4.3代码中的外键创建组合键时遇到了问题。我想通过数据注释来解决这个问题。我无法找到正确的数据注释,说明EventID是外键事件,并且是EventVote表中主键的一部分。我如何做到这一点代码第一个由外键组成的密钥ef 4.3

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”引进国外KEY约束“EventVote_User”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 无法创建约束。查看以前的错误。

+0

错误信息或描述什么实际上没有工作? – AaronLS 2012-03-14 22:39:18

+0

更新错误消息 – gh9 2012-03-14 22:44:56

+1

发布“事件”和“用户”类的代码 – Eranga 2012-03-15 00:04:48

回答

3

试试这个。您也可以将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; } 
} 

编辑:从你的错误消息,这听起来像你有类似于一个一对一的映射关系发生的问题。请参阅本文,了解如何使用流畅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

+0

没有修复错误。 – gh9 2012-03-14 22:45:22

+1

我最终使用了dataanotations和级联删除和更新的混合。谢谢! – gh9 2012-03-16 15:40:34