В EF Core 2.1.3 я использую преобразование, но у меня есть InvalidcastException
. Обратите внимание, что MyProperty
имеет правильные приведения, требуемые кодом ниже.
В контексте:
builder.Entity<MyTable>().Property(o => o.MyProperty).HasMyPropertyConversion();
В некоторых классах расширений:
public static PropertyBuilder<MyProperty> HasMyPropertyConversion(this PropertyBuilder<MyProperty> property)
=> property.HasConversion(
myProperty => (long)myProperty,
value => (MyProperty)value);
Пример, который сбои:
public void ThisFails(long value)
{
var _ = _myContext
.MyTable
.Where(x => x.MyProperty == value)
.ToList();
}
Примеры работы:
public void ThisWorks()
{
var _ = _myContext
.MyTable
.Where(x => x.MyProperty == 10L)
.ToList();
}
public void ThisWorksAWell(long value)
{
var _ = _myContext
.MyTable
.AsEnumerable()
.Where(x => x.MyProperty == value)
.ToList();
}
Ошибка:
System.InvalidCastException
Invalid cast from 'System.Int64' to 'MyProject.MyProperty'.
Похоже, генерация SQL с параметром завершается неудачей. Обратите внимание, что я не могу написать тест In-memory, который воспроизводит его.
ОБНОВЛЕНИЕ:
Я сделал repro как с локальными БД, так и с тестами БД в памяти.
UPDATE2:
Проблема решена в net core 3.0