实体框架:复合键的字段不能为空

本文关键字:字段 不能 框架 复合 实体 | 更新日期: 2023-09-27 18:36:18

我有一个带有复合键的模型 - 行是键:

public class Item
{
    [Key, Column(Order = 0)]
    public int UserId { get; set; }
    [Key, Column(Order = 1)]
    public DateTime? Date { get; set; }
}

运行下面的代码会抛出异常DbEntityValidationException并显示消息:The Date field is required.

var it = new Item { Date = null, UserId = 2 };
m_Entities.Items.Add(it);
m_Entities.SaveChanges(); // throws exception

m_Entities通常是DbContext后代,项目定义为DbSet<Item>)如果可以null(声明为DateTime?),为什么需要Date?以及如何让null成为Date的有效值?

实体框架:复合键的字段不能为空

拉斐尔的回答引导我进行另一次搜索。这就是为什么这是不可能的(来自Cobsy的答案):

复合主键中的可为空列有什么问题?

总之: NULL == NULL -> 假

威尔德。我的解决方案是将 Id 列添加到模型中。

顺便说一句:MySQL 允许我不定义主键,然后我被允许拥有这样的架构 - EF 抱怨没有定义键:-(。

Sql Server或Oracle不可能用于主键的任何部分。

但是,您可以对这些数据进行唯一的约束。

这意味着您可以有一次

UserId = 2, Date = null

然后

UserId = 2, Date = <NOT NULL>

不能使用 Code First 直接创建唯一约束,但请查看 SMO。

这是不可能的。每个RDBMS要求都是,主键必须不可为空。