20

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

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定义为 Items 的后代)如果可以(声明为DbSet<Item>)为什么是必需的?以及如何允许成为有效值?DatenullDateTime?nullDate

4

3 回答 3

11

拉斐尔的回答引导我进行另一次搜索。这是不可能的原因(Cobsy 的回答):

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

简而言之: NULL == NULL-> false

奇怪。我的解决方案是将 Id 列添加到模型中。

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

于 2012-06-04T21:36:47.487 回答
3

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

但是你可以对这些数据有一个独特的约束。

这意味着你可以有一次

UserId = 2, Date = null

然后

UserId = 2, Date = <NOT NULL>

您无法使用 Code First 直接创建唯一约束,但请查看 SMO。

于 2012-06-04T21:15:53.260 回答
0

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

于 2012-06-04T20:52:40.277 回答