C# 如何在实体框架核心中创建没有主键的表?

C# 如何在实体框架核心中创建没有主键的表?,c#,asp.net-core,ef-code-first,entity-framework-core,asp.net-core-2.0,C#,Asp.net Core,Ef Code First,Entity Framework Core,Asp.net Core 2.0,我有一个旧数据库,其中有些表没有主键。现在我将我的旧项目转移到Asp.NETCore,并使用EntityFrameworkCore2.0.1代码优先的方法。我创建了表的模型类,并尝试使用addmigration添加迁移,但它给出了以下错误。从技术上讲,我认为这是预期的行为,但还有什么其他替代方法,使我不需要修改现有的表模式呢 System.InvalidOperationException:实体类型“TestTable”需要 要定义的主键。在 Microsoft.EntityFrameworkC

我有一个旧数据库,其中有些表没有主键。现在我将我的旧项目转移到Asp.NETCore,并使用EntityFrameworkCore2.0.1代码优先的方法。我创建了表的模型类,并尝试使用
addmigration
添加迁移,但它给出了以下错误。从技术上讲,我认为这是预期的行为,但还有什么其他替代方法,使我不需要修改现有的表模式呢

System.InvalidOperationException:实体类型“TestTable”需要 要定义的主键。在 Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidateNonullPrimaryKeys(IModel 模型)在 Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.Validate(IModel 模型)在 Microsoft.EntityFrameworkCore.Infrastructure.RelationalModelValidator.Validate(IModel 模型)在 Microsoft.EntityFrameworkCore.Internal.SqlServerModelValidator.Validate(IModel 模型)在 Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext 上下文,IConventionSetBuilder约定SetBuilder,IModelValidator 验证程序)在 System.Collections.Concurrent.ConcurrentDictionary
2.GetOrAdd(TKey
键,Func
2值工厂) Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel() 在 Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite,服务提供商)位于 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(IServiceCallSite
调用站点,目标参数)位于
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite
scopedCallSite,服务提供程序)位于
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(IServiceCallSite 调用站点,目标参数)位于 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite,服务提供商)位于 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(IServiceCallSite
调用站点,目标参数)位于
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite
scopedCallSite,服务提供程序)位于
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(IServiceCallSite 调用站点,目标参数)位于 Microsoft.Extensions.DependencyInjection.ServiceProvider.c__DisplayClass22_0.b__0(ServiceProvider 供应商)在 Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(类型 服务类型)在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider 提供程序,键入serviceType)位于 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider 供应商)在 Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
在 Microsoft.EntityFrameworkCore.DbContext.get\u InternalServiceProvider() 在 Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure
1
存取器)在
Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func
1 工厂)在 Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(字符串 上下文类型)在 Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(字符串 名称、字符串outputDir、字符串contextType)位于 Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(字符串 名称、字符串outputDir、字符串contextType)位于 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.c__DisplayClass3_0`1.b__0() 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(操作 操作)实体类型“TestTable”需要一个主键 定义

型号类别:

public class TestTable
{
    [StringLength(255)]
    public string Col1 { get; set; }
    [Required]
    public int Col2 { get; set; }
    [Required]
    public int Col3 { get; set; }
    public DateTime? Col4 { get; set; }
    [Required]
    public int Col5 { get; set; }
    [Required]
    public int Col6 { get; set; }
    [Required]
    public int Col7 { get; set; }
}
我曾经想过一个解决方案,比如添加一个自动增量标识列作为PK。请建议一个好的和正确的方法来做到这一点

[Key]
public int Id { get; set; }

在上下文的代码文件中:

protected override void OnModelCreating( DbModelBuilder model_builder )
{
    base.OnModelCreating( model_builder );
    model_builder.Entity<TestTable>().HasKey(
        t => new { t.Id }
    );
}
protectedoverride void onmodel创建(DbModelBuilder model\u builder)
{
基于模型创建(模型构建器);
model_builder.Entity().HasKey(
t=>new{t.Id}
);
}

因此,基本上您只需要指定哪些列可以作为主键。

您的解决方案是添加一个自动增量标识列作为PK,这对您来说非常好,因为EF要求PK能够唯一地标识每个记录,这对于插入和更新操作非常必要。您可以尝试EF Core 2.1释放时。根据文档,它们的一个使用场景是“映射到未定义主键的表”@IvanStoev,这将非常有用。你知道EF Core 2.1的发布日期吗?据《每日邮报》报道,这和我想的一样