#c# #.net-core #entity-framework-core
#c# #.net-core #entity-framework-core
Вопрос:
У меня есть эта модель:
public class Something
{
public int Id { get; set; }
public Uri Hyperlink { get; set; }
}
Все Uri
типы сохраняются в базе данных в виде строки с использованием fluent api с использованием следующего кода:
if (property.PropertyType == typeof(Uri))
{
modelBuilder.Entity(entity.Name).Property<Uri>(property.Name).HasConversion(
x => x.ToString(),
x => new Uri(x));
}
Но при запуске databaseContext.Database.EnsureCreated();
я получаю следующее исключение:
Система.Исключение InvalidOperationException: ‘Не найден подходящий конструктор для типа объекта ‘Uri’. Следующие параметры не могут быть привязаны к свойствам объекта: ‘uriString’, ‘uriString’, ‘dontEscape’, ‘baseUri’, ‘relativeURI’, ‘dontEscape’, ‘uriString’, ‘uriKind’, ‘baseUri’, ‘relativeURI’, ‘SerializationInfo’, ‘StreamingContext’, ‘baseUri’, ‘relativeURI’, ‘flags’, ‘UriParser’, ‘uri’.’
Ответ №1:
Попробуйте обработать свойство как строку и добавить аннотацию следующим образом
public class Something
{
public int Id { get; set; }
[DataType(DataType.Url)]
public string Hyperlink { get; set; }
}
ИЛИ это
modelBuilder.Entity<Something>().Property(p => p.Hyperlink)
.HasConversion(
p => p.Value,
p => Hyperlink.FromValue(p));
Комментарии:
1. Я все еще получаю ту же ошибку после добавления
[DataType(DataType.Url)]
2. @Yann обновлен ответ, попробуйте второй вариант и сообщите мне, пожалуйста
3. Использование string (в отличие от типа Uri) работает как обходной путь, и это то, к чему я прибегнул на данный момент. «Гиперссылка. Само решение » fromValue» не сработало, поскольку гиперссылка не существует в текущем контексте. И, хотя использование
string
в качестве обходного пути технически работает, к сожалению, это не ответ при сохранении типа Uri через ядро EF, поскольку для этого требуется либо отказаться от типа Uri, либо выполнить преобразование значений вне ядра EF…