Карта System.Uri с использованием Entity Framework Fluent Api - PullRequest
13 голосов
/ 18 февраля 2011

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

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

Ответы [ 4 ]

12 голосов
/ 11 июня 2018

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

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

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

3 голосов
/ 20 января 2015

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

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

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

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

0 голосов
/ 18 февраля 2011

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

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

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

using System.ComponentModel.DataAnnotations;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...