实体框架:复合键的字段不能为空
本文关键字:字段 不能 框架 复合 实体 | 更新日期: 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要求都是,主键必须不可为空。