2016-04-16 30 views
0

请仔细阅读这个问题:Create code first, many to many, with additional fields in association table组合键和分离身份密钥

这里是OP的场景:

public class Member 
{ 
    public int MemberID { get; set; } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public virtual ICollection<Comment> Comments { get; set; } 
} 

public class Comment 
{ 
    public int CommentID { get; set; } 
    public string Message { get; set; } 

    public virtual ICollection<Member> Members { get; set; } 
} 

public class MemberComment 
{ 
    public int MemberID { get; set; } 
    public int CommentID { get; set; } 
    public int Something { get; set; } 
    public string SomethingElse { get; set; } 
} 

接受的答案是:

public class MemberComment 
{ 
    [Key, Column(Order = 0)] 
    public int MemberID { get; set; } 
    [Key, Column(Order = 1)] 
    public int CommentID { get; set; } 

    public virtual Member Member { get; set; } 
    public virtual Comment Comment { get; set; } 

    public int Something { get; set; } 
    public string SomethingElse { get; set; } 
} 

现在,我的问题是:如果我想添加另一个身份字段,如Guid或AutoInc int,例如:

public int MemberCommentID { get; set; } 

我不是在讨论这是更好的方法还是没有,我想知道我该怎么做?

我在想这样的事情

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

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

    public virtual Member Member { get; set; } 
    public virtual Comment Comment { get; set; } 

    public int Something { get; set; } 
    public string SomethingElse { get; set; } 
} 

但随后EF将(我认为)使用的关键,权当是MemberCommentID的3场是孤独的1个键,MEMBERID + CommentID是另一个关键。

回答

1

在这种情况下,为什么不在MemberIDCommentID上使用ForeignKey

public class MemberComment 
{ 
    [Key] 
    public int MemberCommentID { get; set; } 

    [ForeignKey] 
    public int MemberID { get; set; } 
    [ForeignKey] 
    public int CommentID { get; set; } 

    public virtual Member Member { get; set; } 
    public virtual Comment Comment { get; set; } 

    public int Something { get; set; } 
    public string SomethingElse { get; set; } 
} 

正如你可以看到它实际上将让你有重复MemberComment S(连接同一会员和注释实例)。

如果你想强制执行MemberComment只能连接一次,那么你可以用Unique Constraint来实现。

但是,如果这是您的要求(每个会员评论对的一个MemberComment),那么为什么要添加一个MemberCommentID密钥?

MemberID, CommentID是一个完美和自然的主要关键,即没有额外的领域/指数完成所有工作。

+0

为什么它没有强制执行关键的MemberID + CommentID,如果我尝试用重复的MemberID + CommentID添加一个新的MemberComment,EF不会抛出任何错误..:/ –

+0

是的,我知道它是完美的......痛苦工作和维护现有数据库:/ –

+0

@ClickOk因此,它是[code-first-from-database](https://msdn.microsoft.com/en-us/library/jj200620.aspx),而不是代码优先因为它在你的问题中被标记,或者我错过了什么? –