使用Entity Framework Fluent Api映射System.Uri

Pau*_*aul 15 c# entity-framework ef-code-first ef-fluent-api

非常简单的问题.我有一个具有属性的模型System.Uri. Uris没有默认的无参数构造函数,也没有ID字段.有没有办法覆盖我的模型生成,以自定义方式将其存储在数据库中(例如,作为一个string)?在NHibernate中,我之前通过实现完成了这个IUserType,但我在CodeFirst中找不到类似的机制.

显然,我可以创建一个使用Uri底层的自定义类型并公开常规的可映射属性和构造函数,我只是好奇是否有任何方法来映射这个系统类型,这样我就不必像这样制作包装器了.

dst*_*stj 17

这是一个非常古老的问题,但我今天也遇到了同样的问题.使用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());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 现在应该是正确的答案 (2认同)

Die*_*hon 8

EF不支持NH等自定义类型映射.

特别是对于System.Uri,我使用包装器属性并将实际值映射为字符串; 没那么糟糕.

  • 你能提供一个例子或代码片段来澄清吗? (4认同)

Shi*_*mmy 6

不幸的是,没有直接的方法来映射System.UristringEF。

但是,您可以使用数据注释并按如下方式指定您的 URL 属性:

[DataType(DataType.Url)]
public string Link { get; set; }
Run Code Online (Sandbox Code Playgroud)

这将能够告诉某些服务应该将其显示为 URL 并进行验证(例如 ASP.NET 和 Silverlight 已内置对此的支持)。