使用实体框架核心时如何将“ Uri”转换为字符串

时间:2019-04-30 12:08:51

标签: c# entity-framework-core

我想使用POCO类中的Entity Framework Core创建数据库表。当我尝试添加新的脚手架项目(选项:VS中使用Entity Framework(CRUD)的Razor页面)时,出现错误消息:“找不到适用于实体类型'Uri'的合适构造函数”

我了解到,(除其他外)Uri必须在OnModelCreating方法(从dbContext继承的类中)中转换为String。

DbContext类:

    public class SchoolDbContext : DbContext {
      public DbSet<Student> Students { get; set; }

      protected override void OnModelCreating(ModelBuilder modelBuilder) {
        modelBuilder.Entity<Student>()
        .Property(t => t.Homepage)
        .HasConversion(
        v => v.ToString(),
        v => new Uri(v));
      }
    }

学生班:

    public class Student {
      public int ID { get; set; }
      public Uri Homepage {get; set; }
    }

我知道输入命令“ Add-Migration Initial”时会调用OnModelCreating方法。但是由于我尝试自动实现CRUD类,因此无法输入命令“ Add Migration Initial”。 非常感谢,对不起我的英语不好。.

4 个答案:

答案 0 :(得分:1)

var uri = new Uri(path);
uri.AbsolutePath();

答案 1 :(得分:0)

如果我正确理解您的要求,则可以尝试编写:

Path.Combine(Homepage.Segments);

创建代表Uri路径的字符串。

答案 2 :(得分:0)

如果您需要使用Uri属性UriUri.AbsolutePath转换为字符串,则将返回Uri的字符串转换。 例如:

  public class Student
   {
       public int ID { get; set; }
       public Uri Homepage { get; set; }
   }
   Student s= new Student();
   string myUri = s.Homepage.AbsolutePath;
or

    public class SchoolDbContext : DbContext {
    public DbSet<Student> Students { get; set; }

          protected override void OnModelCreating(ModelBuilder modelBuilder) {
            modelBuilder.Entity<Student>()
            .Property(t => t.Homepage.AbsolutePath);
          }
        }

答案 3 :(得分:0)

我终于找到了解决我问题的方法:尽管我确实编写了一个从DbContext继承的SchoolDbContext类,但是我没有指定该特定类作为我的数据库访问的Context。当创建一个新的脚手架项目(使用实体框架(CRUD)的剃刀页面)时,要求您指定模型类和上下文类。不必使用“ +”按钮生成新的上下文(我一直都这样做),而是必须指定SchoolDbContext类。