'No suitable constructor found for entity type' 进行 EF Core 迁移时 (SmartEnum)
'No suitable constructor found for entity type' when doing EF Core migration (SmartEnum)
我正在尝试 运行 update-database
迁移我对数据库所做的一些更改。
一切顺利,直到出现以下错误:
No suitable constructor found for entity type 'ReportType'. The
following constructors had parameters that could not be bound to
properties of the entity type: cannot bind 'id', 'name' in
'ReportType(string id, string name)'.
这是 ReportType.cs 的代码:
public class ReportType : SmartEnum<ReportType, string>
{
public static readonly ReportType ReportType1 = new ReportType("Blah", "Blah");
public static readonly ReportType ReportType2 = new ReportType("Blah", "Blah");
public static readonly ReportType ReportType3 = new ReportType("Blah", "Blah");
// required for EF, but breaking for SmartEnum
// private ReportType() {}
private ReportType(string id, string name) : base(name, id)
{
}
}
如您在该代码的注释部分中所见,拥有无参数构造函数通常可以解决 EF Core 的此问题,但 SmartEnum 没有无参数构造函数基础。
2018 年 Arpil 27 日对 SmartEnum 库进行了提交,添加了一个无参数构造函数,这样这个问题就不存在了,但在后来的提交中删除了这个更改,我不确定没有它如何继续.
可以在此处找到该提交:https://github.com/ardalis/SmartEnum/commit/870012d406609a4a8889fdde2139750dc618d6a9
并在此提交中删除:
https://github.com/ardalis/SmartEnum/commit/1c9bf3ede229fcb561330719cd13af67dcf92ad7
非常感谢任何帮助!
编辑:
根据 Ivan 的评论,这是我对这个问题的解决方案:
modelBuilder.Entity<Report>()
.Property(p => p.ReportType)
.HasConversion(
p => p.Value,
p =>ReportType.FromValue(p));
在 ApplicationDbContext.cs 的 OnModelCreating 中:
modelBuilder.Entity<Report>()
.Property(p => p.ReportType)
.HasConversion(
p => p.Value,
p =>ReportType.FromValue(p));
你的构造函数看起来像这样
private ReportType(string id, string name) : base(name, id)
{}
但是,如果将其更改为
private ReportType(string name, string value) : base(name, value)
{}
它会起作用的。刚刚在我的代码上测试了它。
EF 核心需要无参数构造函数,或带有配置属性(名称和值)参数的构造函数。
您的构造函数的问题是您提供了“id”,但在基础 class 中没有这样的 属性。您需要传递“值”
我正在尝试 运行 update-database
迁移我对数据库所做的一些更改。
一切顺利,直到出现以下错误:
No suitable constructor found for entity type 'ReportType'. The following constructors had parameters that could not be bound to properties of the entity type: cannot bind 'id', 'name' in 'ReportType(string id, string name)'.
这是 ReportType.cs 的代码:
public class ReportType : SmartEnum<ReportType, string>
{
public static readonly ReportType ReportType1 = new ReportType("Blah", "Blah");
public static readonly ReportType ReportType2 = new ReportType("Blah", "Blah");
public static readonly ReportType ReportType3 = new ReportType("Blah", "Blah");
// required for EF, but breaking for SmartEnum
// private ReportType() {}
private ReportType(string id, string name) : base(name, id)
{
}
}
如您在该代码的注释部分中所见,拥有无参数构造函数通常可以解决 EF Core 的此问题,但 SmartEnum 没有无参数构造函数基础。
2018 年 Arpil 27 日对 SmartEnum 库进行了提交,添加了一个无参数构造函数,这样这个问题就不存在了,但在后来的提交中删除了这个更改,我不确定没有它如何继续.
可以在此处找到该提交:https://github.com/ardalis/SmartEnum/commit/870012d406609a4a8889fdde2139750dc618d6a9
并在此提交中删除: https://github.com/ardalis/SmartEnum/commit/1c9bf3ede229fcb561330719cd13af67dcf92ad7
非常感谢任何帮助!
编辑:
根据 Ivan 的评论,这是我对这个问题的解决方案:
modelBuilder.Entity<Report>()
.Property(p => p.ReportType)
.HasConversion(
p => p.Value,
p =>ReportType.FromValue(p));
在 ApplicationDbContext.cs 的 OnModelCreating 中:
modelBuilder.Entity<Report>()
.Property(p => p.ReportType)
.HasConversion(
p => p.Value,
p =>ReportType.FromValue(p));
你的构造函数看起来像这样
private ReportType(string id, string name) : base(name, id)
{}
但是,如果将其更改为
private ReportType(string name, string value) : base(name, value)
{}
它会起作用的。刚刚在我的代码上测试了它。 EF 核心需要无参数构造函数,或带有配置属性(名称和值)参数的构造函数。 您的构造函数的问题是您提供了“id”,但在基础 class 中没有这样的 属性。您需要传递“值”