22

I have a model with composite key - the row is the key:

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

Running the code below it throws an exception DbEntityValidationException with message: 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 is usual DbContext descendant with Items defined as DbSet<Item>) Why is the Date required if it can be null (declared as DateTime?) ? And how to allow null to be a valid value for Date?

Zoka
  • 2,312
  • 4
  • 23
  • 33

3 Answers3

14

Answer from Raphael lead me to another search. Here is the why it is not possible (answer from Cobsy):

What's wrong with nullable columns in composite primary keys?

In short: NULL == NULL -> false

Wierd. The solution for me is to add Id column into Model.

BTW: MySQL allow me not to define Primary Key, then I'm allowed to have such schema - EF complains about not defining the key :-(.

Community
  • 1
  • 1
Zoka
  • 2,312
  • 4
  • 23
  • 33
3

It's not possible with Sql Server, or Oracle for any part of a primary key.

But you can have a unique constraint on these datas.

Which means you can have one time

UserId = 2, Date = null

Then

UserId = 2, Date = <NOT NULL>

You can't create directly unique constraints with Code First, but look at SMO.

Raphaël Althaus
  • 59,727
  • 6
  • 96
  • 122
0

It is not possible. Every RDBMS requirement is, that primary key must be not nullable.

Hamlet Hakobyan
  • 32,965
  • 6
  • 52
  • 68
  • 8
    Well, the primary key is {UserId, Date} where it is ensured that only Date is nullable - so why it is not possible? Do not agree with your statement. Still, the code is kind of port from PHP/MySQL where it was possible... – Zoka Jun 04 '12 at 20:55