Подтвердить что ты не робот

Entity Framework: поле составного ключа не может быть нулевым?

У меня есть модель с составным ключом - строка является ключом:

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 с DbContext определенными как DbSet<Item>). Почему требуется Date если она может быть null (объявлена как DateTime?)? И как разрешить null быть допустимым значением для Date?

4b9b3361

Ответ 1

Ответ Рафаэля привел меня к другому поиску. Вот почему это невозможно (ответ от Cobsy):

Что случилось с нулевыми столбцами в составных первичных ключах?

Короче: NULL == NULL → false

Wierd. Решение для меня - добавить столбец Id в Model.

BTW: MySQL позволяет мне не определять первичный ключ, тогда мне разрешено иметь такую схему - EF жалуется на то, что не определил ключ :-(.

Ответ 2

Это невозможно с Sql Server или Oracle для любой части первичного ключа.

Но вы можете иметь уникальное ограничение на эти данные.

Это означает, что вы можете иметь один раз

UserId = 2, Date = null

затем

UserId = 2, Date = <NOT NULL>

Вы не можете создавать напрямую уникальные ограничения с помощью Code First, но смотрите на SMO.

Ответ 3

Это невозможно. Каждое требование RDBMS состоит в том, что первичный ключ должен быть недействительным.