【问题标题】:Can I have a primary key/unique constraint on multiple properties that are unique in any order?我可以对多个按任何顺序唯一的属性设置主键/唯一约束吗?
【发布时间】:2016-02-28 16:56:53
【问题描述】:

我有以下模型,它本质上是一个多对多关系表。

public class Friend
{
    [Key, ForeignKey("UserA")]
    public int UserAId { get; set; }
    public virtual User UserA { get; set; }

    [Key, ForeignKey("UserB")]
    public int UserBId { get; set; }
    public virtual User UserB { get; set; }

    public DateTime Since { get; set; }

    ...
}

在我的应用程序中,友谊总是双向的。如何限制我的后端插入 new Friend { UserAId = 1, UserBId = 2 } 和 new Friend { UserAId = 2, UserBId = 1 }?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework ef-code-first entity-framework-6


    【解决方案1】:

    我认为您只有一个解决方案:在您的表上手动创建约束(您可以添加迁移,然后编写类似这样的内容):

    public override void Up()
    {
        Sql(@"ALTER TABLE dbo.Friends ADD 
        CONSTRAINT CustomOrder CHECK (UserAId > UserBId)");
    }
    
    public override void Down()
    {
        Sql(@"ALTER TABLE dbo.Friends DROP CONSTRAINT CustomOrder");
    }
    

    现在您只能添加这样的用户 ID 对:2 - 1、5 - 3,但不能添加 1 - 2 和 3 -5,因此我们没有您想要的重复项,但您还必须提供分配给 UserA id 值会大于 UserB 的 id 值,但我认为这对你来说并不难。

    【讨论】:

    • "但您还必须提供分配给 UserA 的 ID 值,该值将大于 UserB 的 ID 值,但我认为这对您来说并不难。" 它是做什么的意思是?他应该检查哪个 id 比另一个大吗?如果是这样,检查 id 也是避免重复,不需要实现你的代码,不是吗?
    • 不,不好的评论。但我的解决方案包括解决并发问题。例如,让我们考虑您的建议:我们有一对表:1-2 和 5-4,然后我们检查 - 我们可以插入 6-3 对吗,当然可以,但是并行任务执行 insert(3-6) 之间我们的检查和插入,表变成 (1-2, 5-4, 3-6) 而不是我们执行插入,结果是 (1-2, 5-4, 3-6, 6-3) - 不酷。让我们考虑一下我的解决方案:表看起来是这样的:(2-1,5-4)(2-1,因为排序),隐藏插入表之后将是(2-1,5-4,6-3)当我们再次尝试插入 6-3 时,就会出现错误。
    • 另外,我们不需要在每次插入操作之前从数据库中检索现有的 id。
    • 我最终这样做了,但使用了<。出于某种原因,对我来说,使用 1-3、2-5、3-4 而不是 3-1、5-2、4-3 这样的对似乎更自然。
    • 小问题,为什么字符串前面有@?
    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 2015-08-04
    • 2019-09-23
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多