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
?
Ответы
Ответ 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 состоит в том, что первичный ключ должен быть недействительным.