Карта System.Uri с использованием Entity Framework Fluent Api
Довольно простой вопрос. У меня есть модель, которая имеет свойство, которое является System.Uri
тип. Uri
s не имеет конструктора по умолчанию без параметров и поля идентификатора. Есть ли способ переопределить генерацию моей модели, чтобы сохранить ее в БД по своему усмотрению (например, просто как 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;
Надеюсь, это поможет...