Ответ 1
EF не поддерживает отображения пользовательского типа, такие как NH.
В System.Uri, в частности, я бы использовал свойство wrapper и отображал фактическое значение в виде строки; это не так уж плохо.
Довольно простой вопрос. У меня есть модель, которая имеет свойство типа System.Uri
. Uri
не имеют конструктора без параметров без параметров и поля идентификатора. Есть ли способ переопределить генерацию модели для ее сохранения в БД по-своему (например, как string
)? В NHibernate, я сделал это раньше, реализовав IUserType
, но я не смог найти аналогичный механизм в CodeFirst.
Очевидно, я мог бы создать пользовательский тип, который использует Uri
под капотом и предоставляет обычные отображаемые свойства и конструктор, мне просто интересно, есть ли способ сопоставить этот тип системы, чтобы мне не приходилось сделайте такую обертку.
EF не поддерживает отображения пользовательского типа, такие как NH.
В System.Uri, в частности, я бы использовал свойство wrapper и отображал фактическое значение в виде строки; это не так уж плохо.
Это очень старый вопрос, но у меня сегодня такой же вопрос. С 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;
Надеюсь, что это поможет...