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

时间:2012-06-04 20:43:35

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

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

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的有效值?

3 个答案:

答案 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要求都是,主键必须不可为空。

相关问题