实体框架 (EF) 旨在根据模型类名称表示单一实体的约定自动对表名称进行复数化。但是,在某些情况下,您可能会遇到差异,EF 创建复数表名称,而模型或视图需要单数名称。
问题:
提供的代码定义了一个名为 Vote 的模型,并期望 MySQL 中有一个名为“vote”的表。但是,EF 而是创建了一个名为“votes”的表。尝试从视图访问表时,发生异常,指示“投票”表不存在。
可能的原因:
MySQL .NET 连接器可能不完全支持 EF 的表名复数约定。
解决方案:
要解决此问题,您可以在 EF 中自定义表名复数行为。步骤如下:
1.自定义 OnModelCreating 方法:
在 DbContext 类中,重写 OnModelCreating 方法并禁用 PluralizingTableNameConvention。
<code class="csharp">protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); }</code>
2.删除初始数据库创建:
实体框架初始化程序可用于创建和初始化数据库。但是,MySQL 的 .NET Connector 可能不允许 EF 创建数据库。为了防止出现此问题,请确保数据库在 EF 尝试创建数据库之前存在。
<code class="csharp">// Remove database creation initializer // Database.SetInitializer(new DropCreateDatabaseAlways<myDB>());</code>
3.停止基本模型创建调用:
确保不调用 OnModelCreating 的基本实现,因为它可能会覆盖您的自定义并重新启用表名复数。
<code class="csharp">// Don't call the base implementation // base.OnModelCreating(modelBuilder);</code>
4。如果不存在则创建数据库:
如果数据库不存在,请手动创建。这样可以确保 EF 可以使用正确的表名,而不会遇到缺少表的异常。
其他提示:
按照以下步骤,您应该能够解决表名复数问题差异问题并成功访问您视图中的“投票”表。
以上是当我的模型需要单数名称时,为什么实体框架在 MySQL 中使用复数表名称?的详细内容。更多信息请关注PHP中文网其他相关文章!