实体框架核心2.1.1代码优先

时间:2018-07-12 12:58:31

标签: c# sql-server entity-framework ef-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

我的代码是:

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!");
    }
}

现在,如果我在程序包管理器控制台中运行命令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   modelBuilder)        在Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.ImmediateConventionScope.OnModelBuilt(InternalModelBuilder   modelBuilder)        在Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext   上下文,IConventionSetBuilder ConventionSetBuilder,IModelValidator   验证器)        在System.Lazy 1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy 1.ExecutionAndPublication(LazyHelper执行AndPublication,布尔值useDefaultConstructor)处        在System.Lazy 1.CreateValue() at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel() at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model() at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies() at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() at Microsoft.EntityFrameworkCore.Internal.InternalAccessorExtensions.GetService[TService](IInfrastructure 1   访问者)        在Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func 1 factory) at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType) at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0 1.b__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'。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

System.Uri不是可以由EF映射的受支持类型。您需要在实现中为EF提供映射详细信息,或者可以考虑使用字符串。

这篇文章中已经有一些不错的建议:Map System.Uri using Entity Framework Fluent Api