C# 使用实体框架fluentapi映射System.Uri

C# 使用实体框架fluentapi映射System.Uri,c#,entity-framework,ef-code-first,ef-fluent-api,C#,Entity Framework,Ef Code First,Ef Fluent Api,这个问题很简单。我有一个模型,它的属性是System.Uri类型Uris没有默认的无参数构造函数,也没有ID字段。是否有任何方法覆盖我的模型生成,以自定义方式(例如,就像字符串一样)将其存储在数据库中?在NHibernate中,我以前通过实现IUserType来实现这一点,但在CodeFirst中还没有找到类似的机制 显然,我可以创建一个自定义类型,它在后台使用一个Uri,并公开常规的可映射属性和构造函数,我只是想知道是否有任何方法可以映射这个系统类型,这样我就不必制作这样的包装器。EF不支持像

这个问题很简单。我有一个模型,它的属性是
System.Uri
类型
Uri
s没有默认的无参数构造函数,也没有ID字段。是否有任何方法覆盖我的模型生成,以自定义方式(例如,就像
字符串一样)将其存储在数据库中?在NHibernate中,我以前通过实现
IUserType
来实现这一点,但在CodeFirst中还没有找到类似的机制


显然,我可以创建一个自定义类型,它在后台使用一个
Uri
,并公开常规的可映射属性和构造函数,我只是想知道是否有任何方法可以映射这个系统类型,这样我就不必制作这样的包装器。

EF不支持像NH这样的自定义类型映射

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

试着这样做

[Column(Name="MyUri", TypeName="string")]
public Uri MyUri
确保添加列属性所需的引用

using System.ComponentModel.DataAnnotations;

希望这有助于…

不幸的是,没有直接的方法可以使用EF将
System.Uri
映射到
string

但是,您可以使用数据批注并按如下方式对URL属性进行属性设置:

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

这将能够告诉一些服务,这应该显示并验证为URL(例如ASP.NET和Silverlight内置了对它的支持)。

这是一个非常古老的问题,但我今天刚刚遇到了同样的问题。使用Entity Framework Core 2.1,您可以设置:

公共类MyEntityDbConfiguration:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
builder.Property(e=>e.UriField)
.HasConversion(v=>v.ToString(),v=>newURI(v));
}
}
公共类MyDbContext:DbContext
{
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
ApplyConfiguration(新的MyEntityDbConfiguration());
}
}

只是想确定我指的是EF code First的CTP5没有乐趣,这不起作用。我仍然得到“实体不会往返”错误。是的,我最后做的只是使用一个字符串,然后执行一个数据类型验证属性。我认为他们在6中得到了支持,而不是5中。你能提供一个示例或代码片段来澄清吗?
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());
    }
}