Entity Framework Code First MySql 表名复数形式处理

5
我正在使用Microsoft Entity Framework和Code First来管理我的数据(使用MySQL)。我定义了一个POCO对象,但是当我尝试添加数据时,它会显示表"Users"不存在。我查看了数据库,它创建了一个名为"User"而不是"Users"的表。我该如何解决这个问题?这让我很烦恼!
谢谢!
  public class User
 {
    [Key,Required]
    public int UserId { get; set; }

    [StringLength(20), Required]
    public string UserName { get; set; }

    [StringLength(30), Required]
    public string Password { get; set; }

    [StringLength(100), Required]
    public string EmailAddress { get; set; }

    [Required]
    public DateTime CreateDate { get; set; }

    [Required]
    public bool IsActive { get; set; }
}

你正在使用什么连接器和版本?这似乎是在那个级别上进行的...不过可能是错误的。 - user359135
嘿,mysql connector net 6.3.7。 - Jeffrey Kevin Pry
如果我在类上方添加[Table("User")],它也可以工作,但我不想这样做。 - Jeffrey Kevin Pry
抱歉,我找不到之前阅读的帖子了,但这似乎可能有一些影响复数形式的方法:https://dev59.com/UFDTa4cB1Zd3GeqPGiFJ - user359135
这些人还有另一个连接器,不是免费的,但有试用版,如果你愿意的话,可以尝试确定它是否是一个贡献因素:http://www.devart.com/dotconnect/mysql/download.html - user359135
3个回答

4
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace YourNamespace
{
    public class DataContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder dbModelBuilder)
        {
            dbModelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }

        public DbSet<User> User { get; set; }
    }
}

3

我还没用过EF来操作MySQL,但无论如何,我认为解决方案是公正的。你需要关闭复数表约定。

using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions.Edm.Db;

public class MyDbContext: DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {    
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

现在EF将寻找你对象名的字面意思来匹配表名。你可以在http://msdn.microsoft.com/en-us/data/aa937723 的Continue Learning Entity Framework下查看一些非常好的视频教程,如果想要更多的学习体验,可以不指定上述内容,而是显式地将'用户'对象映射到'用户'表。其他参考资料请见http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx

谢谢!必须得赞你的清晰解释和提供的链接!再次感谢。 - Jeffrey Kevin Pry

2
你可以在类上放置一个属性,告诉表的名称:
[Table("Users")]
public class User
{
    //...
}

或者您可以使用流畅的API。为此,您需要在DbContext类中重写OnModelCreating方法。

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().Map(t => t.ToTable("Users"));
    }
}

在EF的未来版本中,我们可以编写自己的惯例。截至4.1版本,这一功能尚未实现...(MySQL下尚未测试过)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接