使用实体框架 Fluent Api 映射 System.Uri

Posted

技术标签:

【中文标题】使用实体框架 Fluent Api 映射 System.Uri【英文标题】:Map System.Uri using Entity Framework Fluent Api 【发布时间】:2011-06-29 13:13:40 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

这是一个非常古老的问题,但我今天也有同样的问题。使用 Entity Framework Core 2.1,您可以设置Value Conversion:

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());
    

【讨论】:

【参考方案2】:

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

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

【讨论】:

是的,我最终做的只是使用一个字符串,然后做一个数据类型验证属性。 我认为他们在 6,而不是 5 中得到了支持。 你能提供一个例子或代码sn-p来澄清一下吗?【参考方案3】:

不幸的是,没有直接的方法将 System.Uri 映射到 string 与 EF。

但是,您可以使用数据注释并将您的 URL 属性属性如下:

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

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

【讨论】:

【参考方案4】:

尝试这样做..

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

确保添加列属性所需的引用

using System.ComponentModel.DataAnnotations;

希望对您有所帮助...

【讨论】:

只是想确保我指的是 EF Code First 的 CTP5 不高兴,这不起作用。我仍然收到“实体不会往返”错误。

以上是关于使用实体框架 Fluent Api 映射 System.Uri的主要内容,如果未能解决你的问题,请参考以下文章

EFEF框架 Code First Fluent API

如何使用 Entity Framework Code First Fluent API 指定表名

我是不是需要使用 Fluent API 配置与实体框架的关系的双方?

译第24节---Fluent API - 属性映射

实体框架代码优先 - Fluent Api 与数据注释的优缺点 [关闭]

EF 6.X 中的实体框架代码优先 Fluent API 默认值