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

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

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

4 ответа

Решение

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

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

Это очень старый вопрос, но у меня сегодня был тот же вопрос. С 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());
    }
}

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

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

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

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

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

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

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

using System.ComponentModel.DataAnnotations;

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

Другие вопросы по тегам