我正在尝试创建数据库上下文并为自动生成添加实体控制器。
问题是当我运行控制器URL时,我收到以下错误:
不支持每种类型的多个对象集。对象集'Arduinos'和'Arduinoes'都可以包含'MVC3.Models.Arduino'类型的实例
为什么生成名称“Arduinoes”,因为我指定dbset的名称是“Arduinos”。
型号:
public class DBArduino:DbContext
{
DbSet<Arduino> Arduinos { get; set; }
public System.Data.Entity.DbSet<MVC3.Models.Arduino> Arduinoes { get; set;} //this one is autogenerated after adding the "ArduinoController" why does it change its name?
}
控制器
public class ArduinoController : Controller
{
private DBArduino db = new DBArduino();
// GET: Arduino
public ActionResult Index()
{
return View(db.Arduinoes.ToList());
}
....
}
他从哪里获得“ Arduinoes ”?即使在我重建解决方案并再次添加控制器后,它仍然会得到这个名称。
如何调用通过添加带有实体的控制器生成的数据集的名称?
答案 0 :(得分:0)
分配给自动生成的DbSet
的“ Arduinoes ”名称来自System.Data.Entity.Design.PluralizationServices
类的设计,它考虑以“o”结尾的表类名称(除了前面的) vocals)添加了“ -es ”后缀,如下所示:
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase")]
private string InternalPluralize(string word)
{
// other stuff
if (suffixWord.EndsWith("o", true, this.Culture) || suffixWord.EndsWith("s", true, this.Culture))
{
return prefixWord + suffixWord + "es";
}
// other stuff
}
(在下面的“参考”部分的Github存储库中提供的完整代码视图)
因此,由于在Arduinoes
类中找不到必需的DbContext
属性名称,EF与控制器脚手架相关的机制添加了它,无论是否存在引用具有不同属性的相同表类的其他DbSet
属性由于多个对象集重复,因此抛出InvalidOperationException
。
如果您仍想通过预先指定的DbSet
属性使用控制器脚手架,我建议删除自动生成的部分,然后更改此声明:
public DbSet<Arduino> Arduinos { get; set; }
遵循EF的惯例:
public DbSet<Arduino> Arduinoes { get; set; }
或删除手动声明的DbSet
,然后使用自动生成的。{/ p>
NB:不支持在不同DbSet
属性中引用相同表名的重复表示,因此在使用控制器定义DbSet
属性名时可能需要遵循EF复数约定脚手架。
<强>参考:强>
System.Data.Entity.Design.PluralizationServices.EnglishPluralizationService Reference Source
类似问题:
Multiple object sets of the same type
ASP.NET Identity - Multiple object sets per type are not supported