Во всех примерах, которые я видел, в качестве идентификаторов используются int32
s. Это не всегда практично в производственной среде. Некоторые из наших баз данных имеют идентификаторы идентификаторов, которые находятся в области int64
s, поэтому наша практика всегда использовать long
для свойств наших идентификаторов. Однако SQL Server имеет более высокие максимальные значения для типа столбца int
.
Я делаю первое доказательство концепции с помощью Entity Framework версии 6. С long ID
невозможно сопоставить объект с базой данных.
Я использую Fluent API для всех своих карт. Прямо сейчас это выглядит для идентификатора:
Property(s => s.ID).HasColumnName("spcID");
Если я добавлю .HasColumnType("int")
в конец вышеупомянутого, это даст мне следующую ошибку:
Указанная схема недействительна. Ошибки: (7,12): ошибка 2019: указанное сопоставление элементов недопустимо. Тип «Edm.Int64 [Nullable = False, DefaultValue =]» члена «ID» в типе «EFConnection.Space» несовместим с «SqlServer.int [Nullable = False, DefaultValue =, StoreGeneratedPattern = Identity]» члена spcID в типе CodeFirstDatabaseSchema.Space.
Как вы сопоставите тип данных для них с длинной переменной в .NET?
Изменить
Прямо сейчас у меня есть простой тест интеграции, чтобы убедиться, что я могу подключиться:
[TestMethod]
public void TestMethod1() {
using (var context = new Context()) {
Assert.IsTrue(context.Spaces.Any());
Assert.IsTrue(context.Spaces.First().IsActive);
}
}
Без .HasColumnType("int")
первый Assert проходит, но я получаю InvalidOperationException
на втором:
Свойству «ID» в «Пробел» не может быть присвоено значение «System.Int32». Вы должны установить для этого свойства ненулевое значение типа System.Int64.
.HasColumnType(...)
работает? Я помню, как использовал EF4 и никогда не использовал ограничение, казалось, отлично работает сопоставление SQLint
со значениямиlong
C #. - person Erik   schedule 27.12.2013int
в SQL, используйтеint
в C #. Если вы используетеbigint
в SQL, используйтеlong
в C #. Оба они имеют одинаковый диапазон значений; см. ответ Тревора. - person Dave Zych   schedule 27.12.2013int
в базе данных иlong
в C # было неправильным. В лучшем случае это защита уровня данных в будущем. - person krillgar   schedule 27.12.2013int
, а другогоlong
. Что произойдет, если вы превысите значение, которое может удерживатьint
? Ваш код запускается, но вылетает, когда вы пытаетесь сохранить его в базе данных - и это проблема. - person Dave Zych   schedule 27.12.2013int
имеет гораздо больший диапазон. Я просто излагаю причины, которые мне дали. Тот факт, что эти причины неверны, меняет мои взгляды на них, и я перестану их защищать. - person krillgar   schedule 27.12.2013