Не найден подходящий конструктор для типа объекта ‘Uri’

#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…