MVC不支持每种类型的多个对象集错误

时间:2017-04-09 15:52:59

标签: c# asp.net-mvc entity-framework

我正在尝试创建数据库上下文并为自动生成添加实体控制器。

问题是当我运行控制器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 ”?即使在我重建解决方案并再次添加控制器后,它仍然会得到这个名称。

如何调用通过添加带有实体的控制器生成的数据集的名称?

1 个答案:

答案 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