Карта System.Uri с использованием Entity Framework Fluent Api

Довольно простой вопрос. У меня есть модель, которая имеет свойство типа System.Uri. Uri не имеют конструктора без параметров без параметров и поля идентификатора. Есть ли способ переопределить генерацию модели для ее сохранения в БД по-своему (например, как string)? В NHibernate, я сделал это раньше, реализовав IUserType, но я не смог найти аналогичный механизм в CodeFirst.

Очевидно, я мог бы создать пользовательский тип, который использует Uri под капотом и предоставляет обычные отображаемые свойства и конструктор, мне просто интересно, есть ли способ сопоставить этот тип системы, чтобы мне не приходилось сделайте такую ​​обертку.

Ответ 1

EF не поддерживает отображения пользовательского типа, такие как NH.

В System.Uri, в частности, я бы использовал свойство wrapper и отображал фактическое значение в виде строки; это не так уж плохо.

Ответ 2

Это очень старый вопрос, но у меня сегодня такой же вопрос. С Entity Framework Core 2.1 вы можете настроить Преобразование Значения:

public class MyEntityDbConfiguration : IEntityTypeConfiguration<MyEntity>
{
    public void Configure(EntityTypeBuilder<MyEntity> builder)
    {
        builder.Property(e => e.UriField)
                .HasConversion(v => v.ToString(), v => new Uri(v));
    }
}

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new MyEntityDbConfiguration());
    }
}

Ответ 3

К сожалению, нет прямого способа сопоставления System.Uri с string с EF.

Однако вы можете использовать аннотации данных и атрибутировать свой URL-адрес следующим образом:

[DataType(DataType.Url)]
public string Link { get; set; }

Это позволит сообщить некоторым службам, что это должно отображаться и проверяться как URL (например, ASP.NET и Silverlight поддерживают его).

Ответ 4

Попробуйте сделать это.

[Column(Name="MyUri", TypeName="string")]
public Uri MyUri

Убедитесь, что вы добавили ссылку, необходимую для атрибута столбца

using System.ComponentModel.DataAnnotations;

Надеюсь, что это поможет...