【问题标题】:Composite Keys and separated Identity Key复合键和分离的身份键
【发布时间】:2016-08-08 16:27:15
【问题描述】:

请阅读该问题: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会(我认为)使用键中的3个字段,当右边是MemberCommentID是单独1个键,而MemberID+CommentID是另一个键。

【问题讨论】:

    标签: c# entity-framework many-to-many


    【解决方案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; }
    }
    

    如您所见,它实际上允许您拥有重复的 MemberComments(连接相同的 Member 和 Comment 实例)。

    如果您想强制MemberComment 只能链接一次,那么您可以使用Unique Constraint 来实现。

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

    MemberID, CommentID 是一个完美且自然的主键,无需额外的字段/索引即可完成所有工作。

    【讨论】:

    • 为什么它不强制执行密钥 MemberID+CommentID,如果我尝试添加具有重复 MemberID+CommentID 的新 MemberComment,EF 不会抛出任何错误.. :/
    • 是的,我知道这是完美的......工作和维护现有数据库的痛苦:/
    • @ClickOk 所以它是code-first-from-database,而不是代码优先,因为它在您的问题中被标记,或者我错过了什么?
    • 我没有标记,但我的链接问题是的,所以这就是混乱,对不起。
    • 我会尝试,但我认为不会起作用,因为在数据库中没有强制执行该规则,因此 EF 可能也会忽略它,并且阅读您的链接看起来 EF 不适用于唯一约束外键。也许我会用“保存前”检查+异常处理来编写代码。
    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多