找不到适用于实体类型“ Uri”的合适的构造函数。

时间:2018-10-24 08:25:15

标签: asp.net entity-framework asp.net-core

我有这个模型:

public class Book
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Uri Link { get; set; }
}

我使用以下代码将其添加到fluent-api

 builder.Entity<Book>(entity => {
     entity.HasKey(b => b.Id);
 });

运行此命令时

add-migration InitialMigration -context MyAppContext

然后我得到:

  

找不到适合实体类型“ Uri”的构造函数。以下参数无法绑定到实体的属性:'uriString','uriString','dontEscape','baseUri','relativeUri','dontEscape','uriString','uriKind','baseUri',' relativeUri”,“ serializationInfo”,“ streamingContext”,“ baseUri”,“ relativeUri”,“ flags”,“ uriParser”,“ uri”。

2 个答案:

答案 0 :(得分:1)

您不能直接将Uri持久保存到数据库,因为没有与此相关的SQL类型。您需要使用字符串代替。如果您正在使用视图模型(应该如此),则视图模型可以具有Uri,然后只需在映射到实际实体类型的过程中获取字符串表示形式即可。

您还可以简单地利用EF Core的价值转换(2.1+版本中提供)。有关更多详细信息,请参见docs。本质上,在您流畅的配置中:

.HasConversion(
    v => v.ToString(),
    v => new Uri(v));

答案 1 :(得分:0)

可以将值转换添加到您的DbContext中,以转换从数据库读取或写入数据库时​​使用的类型。这是通过覆盖OnModelCreating方法来完成的。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Book>()
        .Property(e => e.Link)
        .HasConversion(v => v.ToString(), v => new Uri(v));
}