使用 EF 和 Dot Net Core 1(PostgreSQL 数据库)生成迁移时出错
Error generating migration with EF and Dot Net Core 1 (PostgreSQL database)
我遵循了 damienbod ( https://damienbod.com/2016/01/11/asp-net-5-with-postgresql-and-entity-framework-7/ ) 的教程。我设法连接到我的 PostgreSql 数据库,它创建了 EntityMigration 历史记录 table、DataEventRecord table 和 SourceInfo table。一共有三个项目(Postgre需要两个,第三个是我实际的项目):DataAccessPostgreSqlProvider、DomainModel、iConnect。
我创建了一个模型,代码如下,然后执行:add-migration NestProtectDevices -Context NestProtectDevices
我必须指定 -Context 否则会出现错误,如果我指定 DomainModelPostgreSqlContext 的 -Context,它只会生成一个空的迁移文件(而不是从我的模型中生成一个)。这就是我将 -Context 指定为模型名称的原因。下面是模型的代码和我得到的错误。让我知道是否需要任何其他代码来帮助调试。
using DataAccessPostgreSqlProvider;
using DomainModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using DomainModel.Model;
namespace iConnect.Models.Nest
{
public class NestProtectDevices : DomainModelPostgreSqlContext
{
public NestProtectDevices(DbContextOptions<DomainModelPostgreSqlContext> options) : base(options)
{
}
public long DeviceId { get; set; }
public long UserId { get; set; }
public int CompanyId { get; set; }
public long StructureId { get; set; }
public long WhereId { get; set; }
public string Name { get; set; }
public string NameLong { get; set; }
public bool IsOnline { get; set; }
public int BatteryHealth { get; set; }
public int CoAlarmState { get; set; }
public int SmokeAlarmState { get; set; }
public string UiColorState { get; set; }
public bool IsManualTestActive { get; set; }
public DateTime LastManualTestTime { get; set; }
public DateTime Timestamp { get; set;}
}
}
命令出错:
PM> add-migration NestProtectDevices -Context NestProtectDevices
No parameterless constructor was found on 'NestProtectDevices'. Either add a parameterless constructor to 'NestProtectDevices' or add an implementation of 'IDbContextFactory<NestProtectDevices>' in the same assembly as 'NestProtectDevices'.
using DataAccessPostgreSqlProvider;
using DomainModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using DomainModel.Model;
namespace iConnect.Models.Nest
{
public class NestProtectDevices : DomainModelPostgreSqlContext
{
public NestProtectDevices(DbContextOptions<DomainModelPostgreSqlContext> options) : base(options)
{
}
public DbSet<Device> Devices { get; set; }
}
public class Device
{
public long DeviceId { get; set; }
public long UserId { get; set; }
public int CompanyId { get; set; }
public long StructureId { get; set; }
public long WhereId { get; set; }
public string Name { get; set; }
public string NameLong { get; set; }
public bool IsOnline { get; set; }
public int BatteryHealth { get; set; }
public int CoAlarmState { get; set; }
public int SmokeAlarmState { get; set; }
public string UiColorState { get; set; }
public bool IsManualTestActive { get; set; }
public DateTime LastManualTestTime { get; set; }
public DateTime Timestamp { get; set;}
}
}
除非此 DataAccessPostgreSqlProvider 与常规 Sql 提供程序完全不同,否则我认为它应该更像这样设置。顺便说一句,你的 post 中的 link 不好。
您遇到的错误似乎很有帮助。添加一个无参数的构造函数到你的 class 除了你已经有的构造函数。
public NestProtectDevices()
{
}
我遵循了 damienbod ( https://damienbod.com/2016/01/11/asp-net-5-with-postgresql-and-entity-framework-7/ ) 的教程。我设法连接到我的 PostgreSql 数据库,它创建了 EntityMigration 历史记录 table、DataEventRecord table 和 SourceInfo table。一共有三个项目(Postgre需要两个,第三个是我实际的项目):DataAccessPostgreSqlProvider、DomainModel、iConnect。
我创建了一个模型,代码如下,然后执行:add-migration NestProtectDevices -Context NestProtectDevices
我必须指定 -Context 否则会出现错误,如果我指定 DomainModelPostgreSqlContext 的 -Context,它只会生成一个空的迁移文件(而不是从我的模型中生成一个)。这就是我将 -Context 指定为模型名称的原因。下面是模型的代码和我得到的错误。让我知道是否需要任何其他代码来帮助调试。
using DataAccessPostgreSqlProvider;
using DomainModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using DomainModel.Model;
namespace iConnect.Models.Nest
{
public class NestProtectDevices : DomainModelPostgreSqlContext
{
public NestProtectDevices(DbContextOptions<DomainModelPostgreSqlContext> options) : base(options)
{
}
public long DeviceId { get; set; }
public long UserId { get; set; }
public int CompanyId { get; set; }
public long StructureId { get; set; }
public long WhereId { get; set; }
public string Name { get; set; }
public string NameLong { get; set; }
public bool IsOnline { get; set; }
public int BatteryHealth { get; set; }
public int CoAlarmState { get; set; }
public int SmokeAlarmState { get; set; }
public string UiColorState { get; set; }
public bool IsManualTestActive { get; set; }
public DateTime LastManualTestTime { get; set; }
public DateTime Timestamp { get; set;}
}
}
命令出错:
PM> add-migration NestProtectDevices -Context NestProtectDevices
No parameterless constructor was found on 'NestProtectDevices'. Either add a parameterless constructor to 'NestProtectDevices' or add an implementation of 'IDbContextFactory<NestProtectDevices>' in the same assembly as 'NestProtectDevices'.
using DataAccessPostgreSqlProvider;
using DomainModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using DomainModel.Model;
namespace iConnect.Models.Nest
{
public class NestProtectDevices : DomainModelPostgreSqlContext
{
public NestProtectDevices(DbContextOptions<DomainModelPostgreSqlContext> options) : base(options)
{
}
public DbSet<Device> Devices { get; set; }
}
public class Device
{
public long DeviceId { get; set; }
public long UserId { get; set; }
public int CompanyId { get; set; }
public long StructureId { get; set; }
public long WhereId { get; set; }
public string Name { get; set; }
public string NameLong { get; set; }
public bool IsOnline { get; set; }
public int BatteryHealth { get; set; }
public int CoAlarmState { get; set; }
public int SmokeAlarmState { get; set; }
public string UiColorState { get; set; }
public bool IsManualTestActive { get; set; }
public DateTime LastManualTestTime { get; set; }
public DateTime Timestamp { get; set;}
}
}
除非此 DataAccessPostgreSqlProvider 与常规 Sql 提供程序完全不同,否则我认为它应该更像这样设置。顺便说一句,你的 post 中的 link 不好。
您遇到的错误似乎很有帮助。添加一个无参数的构造函数到你的 class 除了你已经有的构造函数。
public NestProtectDevices()
{
}