我有一个带有复合键的模型 - 行是键:
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>
)
如果可以Date
(声明为null
),为什么需要DateTime?
?如何让null
成为Date
的有效值?
答案 0 :(得分:10)
Raphael的回答引导我进行另一次搜索。这就是为什么它不可能(Cobsy回答):
What's wrong with nullable columns in composite primary keys?
简而言之:
NULL == NULL
- &gt;假
奇怪。我的解决方案是将Id列添加到Model中。
BTW:MySQL允许我不定义主键,然后我被允许有这样的模式 - EF抱怨没有定义键: - (。答案 1 :(得分:3)
对于主键的任何部分,无法使用Sql Server或Oracle。
但是你可以对这些数据有一个独特的约束。
这意味着您可以有一次
UserId = 2, Date = null
然后
UserId = 2, Date = <NOT NULL>
您无法使用Code First直接创建唯一约束,但请查看SMO。
答案 2 :(得分:1)
这是不可能的。每个RDBMS要求都是,主键必须不可为空。