C# 实体框架核心2.1.1代码优先

C# 实体框架核心2.1.1代码优先,c#,sql-server,entity-framework,entity-framework-migrations,ef-core-2.1,C#,Sql Server,Entity Framework,Entity Framework Migrations,Ef Core 2.1,这是我理解我的问题的场景 在我的项目中,我参考了以下内容: Microsoft.EntityFrameworkCore 2.1.1 Microsoft.EntityFrameworkCore.Design 2.1.1 Microsoft.EntityFrameworkCore.SqlServer 2.1.1 Microsoft.EntityFrameworkCore.SqlServer.Design 1.1.6 Microsoft.EntityFrameworkCore.Tools 2.1.1

这是我理解我的问题的场景

在我的项目中,我参考了以下内容:

  • Microsoft.EntityFrameworkCore 2.1.1
  • Microsoft.EntityFrameworkCore.Design 2.1.1
  • Microsoft.EntityFrameworkCore.SqlServer 2.1.1
  • Microsoft.EntityFrameworkCore.SqlServer.Design 1.1.6
  • Microsoft.EntityFrameworkCore.Tools 2.1.1
我的代码是:

public class Foo
{
    public Guid Id { get; set; }

    public String Name { get; set; }

    public Uri Address { get; set; }
}

internal class DbManager : IDesignTimeDbContextFactory<DataContext>
{
    public DataContext CreateDbContext(string[] args)
    {
        DbContextOptionsBuilder<DataContext> optionsBuilder = new DbContextOptionsBuilder<DataContext>();

        optionsBuilder.UseSqlServer("[My connection string]");
        return new DataContext(optionsBuilder.Options);
    }
}

public class DataContext : DbContext
{
    public DbSet<Foo> Foo { get; set; }

    public DataContext(DbContextOptions<DataContext> options) : base(options)
    { }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Foo>().HasKey(a => a.Id).HasName($"{nameof(Foo)}_key");
        modelBuilder.Entity<Foo>().ToTable("Partners");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
    }
}
公共类Foo
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共Uri地址{get;set;}
}
内部类DbManager:IDesignTimeDbContextFactory
{
公共DataContext CreateDbContext(字符串[]args)
{
DbContextOptionsBuilder optionsBuilder=新的DbContextOptionsBuilder();
optionsBuilder.UseSqlServer(“[My connection string]”);
返回新的DataContext(optionsBuilder.Options);
}
}
公共类DataContext:DbContext
{
公共DbSet Foo{get;set;}
公共数据上下文(DbContextOptions):基本(选项)
{ }
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity().HasKey(a=>a.Id).HasName($“{nameof(Foo)}\u key”);
modelBuilder.Entity().ToTable(“合作伙伴”);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
控制台。WriteLine(“你好,世界!”);
}
}
现在,如果我在Package Manager控制台中运行命令
Add Migration test1
,我会得到以下错误:

System.InvalidOperationException:找不到适合的构造函数 实体类型“Uri”。无法将以下参数绑定到 实体的属性:“uriString”、“uriString”、“dontEscape”, “baseUri”、“relativeUri”、“dontEscape”、“uriString”、“uriKind”, “baseUri”、“relativeUri”、“serializationInfo”、“streamingContext”, 'baseUri'、'relativeUri'、'flags'、'uriParser'、'uri'。 位于Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConstructorBindingConvention.Apply(InternalModelBuilder 模型生成器) 位于Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.ImmediateConventionScope.OnModelBuilt(InternalModelBuilder 模型生成器) 位于Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext 上下文,IConventionSetBuilder约定SetBuilder,IModelValidator 验证器) 在System.Lazy
1.ViaFactory(LazyThreadSafetyMode模式)
在System.Lazy
1.ExecutionAndPublication(LazyHelper ExecutionAndPublication,布尔值useDefaultConstructor) 在System.Lazy
1.CreateValue()中
在Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel()中
在Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()中
位于Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite
scopedCallSite,ServiceProviderEngineeScope范围)
位于Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite
施工人员所有现场、服务供应商(工程范围)
位于Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite
scopedCallSite,ServiceProviderEngineeScope范围)
位于Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider
提供程序,类型(服务类型)
位于Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider
供应商)
在Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()中
在Microsoft.EntityFrameworkCore.DbContext.get\u InternalServiceProvider()中
在Microsoft.EntityFrameworkCore.Internal.InternalAccessorExtensions.GetService[TService](IInfrastructure)中
存取器)
位于Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func
1
工厂)
位于Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(字符串
上下文类型)
位于Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(字符串
名称、字符串输出目录、字符串上下文类型)
位于Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(字符串
名称、字符串输出目录、字符串上下文类型)
在Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.c__DisplayClass3_0上
在Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(操作
操作)未找到实体类型“Uri”的合适构造函数。这个
无法将以下参数绑定到实体的属性:
‘uriString’、‘uriString’、‘dontEscape’、‘baseUri’、‘relativeUri’,
“dontEscape”、“uriString”、“uriKind”、“baseUri”、“relativeUri”,
“serializationInfo”、“streamingContext”、“baseUri”、“relativeUri”,
'flags'、'uriParser'、'uri'

有什么想法吗


谢谢大家!

System.Uri不是可由EF映射的受支持类型。您需要在您的实现中提供具有映射细节的EF,或者您可以考虑使用字符串。
这篇文章中已经有一些很好的建议:

请用一个更具描述性的标题。@GertArnold你是对的,这是一个重复的问题。。。我怎样才能移除这个?不需要移除它。你的问题现在可以作为复制品的路标。