Entity Framework creates a plural table name, but

2020-01-25 02:07发布

I am using MySQL .net connector 6.4.4.0 and Entity Frame work 4.1 and trying to create the most basic of code-first implementations.

public class myDB: DbContext
{
    public DbSet<Vote> Votes { get; set; }
}

my model

public class Vote
{
    public Guid Id { get; set; }
    public int Value { get; set; }
}

my home controller

public class HomeController : Controller
{
    myDB_db = new myDB();
    public ActionResult Index()
    {
        var model = _db.Votes;
        return View(model);
    }
}

my strongly typed view (using List scaffold)

@model IEnumerable<Namespace.Models.Vote>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Value)
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Value)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
            @Html.ActionLink("Details", "Details", new { id=item.Id }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.Id })
        </td>
    </tr>
    }

</table>

It creates the table 'votes' in mySQL with all the right properties.

However, it throws at this line:

@foreach (var item in Model)

with the exception:

"Table 'mydb.vote' doesn't exist"

edit: To clarify, I actually want table pluralization, and it seems to properly create the table. I'm hoping to discover the reason for the singular/plural discrepancy. None of the tutorials and videos from microsoft / Plural Sight / scott gu handle using mysql, so i have to imagine that the .netconnector might be the culprit. I would also like to avoid using the [Table("Votes")] attributes. Basically I'm hoping for as much of an 'out of the box' solution as possible.

edit2 (some more relevant code): when i remove this...tables fail to create all together. but the view throws an exception looking for 'votes' not 'vote'. within global.asax

protected void Application_Start()
{
     Database.SetInitializer(new DropCreateDatabaseAlways<myDB>());

     AreaRegistration.RegisterAllAreas();
     RegisterGlobalFilters(GlobalFilters.Filters);
     RegisterRoutes(RouteTable.Routes);
}

public class myDBInitializer : DropCreateDatabaseAlways<myDB>
{
    protected override void Seed(myDBcontext)
    {
        base.Seed(context);
    }
}

6条回答
何必那么认真
2楼-- · 2020-01-25 02:20

You need to override OnModelCreating in your DbContext to specify the table name:

modelBuilder.Entity<Vote>().MapSingleType().ToTable("Votes")
查看更多
戒情不戒烟
3楼-- · 2020-01-25 02:26

Remove "Pluralize or singularsize generated object names" check-mark when you create your entity object.

enter image description here

查看更多
手持菜刀,她持情操
4楼-- · 2020-01-25 02:34

If you're using Code First with EF 6.1 +, override the OnModelCreating event handler and make the following call(s):

dmbCloud.Conventions.Remove<PluralizingEntitySetNameConvention>();
dmbCloud.Conventions.Remove<PluralizingTableNameConvention>();
查看更多
SAY GOODBYE
5楼-- · 2020-01-25 02:37

Open the DbContext class related to the tables you want to keep a singular table name.

If you are using EF 6, add a reference to:

using System.Data.Entity.ModelConfiguration.Conventions;

If it is an older version, add a reference to:

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

At last create a method that overrides the OnModelCreating and remove the convention to pluralize table names:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
查看更多
▲ chillily
6楼-- · 2020-01-25 02:39

In your myDB context class, override the following method

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    base.OnModelCreating(modelBuilder);
}

to have it not pluralize the generated table names.

查看更多
等我变得足够好
7楼-- · 2020-01-25 02:40

So I gave up on trying to do it the way I felt it should be done and removed pluralization all together. I don't really know for certain, but I assume the problem has to do with the mysql .net connector's support of EF. Here is what I did.

First, there was a bug in my ApplicationStart method:

//WRONG
//Database.SetInitializer(new DropCreateDatabaseAlways<myDB>());
Database.SetInitializer(new myDBInitializer());

Second, I stopped calling the OnModelCreating base implementation which is not listed in the original code since I only implemented it as per jgauffin's suggestion:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //DONT DO THIS ANYMORE
    //base.OnModelCreating(modelBuilder);
    //modelBuilder.Entity<Vote>().ToTable("Votes")
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}

Third, I read in some posts that the MySQL .net Connector doesn't let EF actually CREATE a database, so I had initially created the blank DB. This seems to no longer be the case with connector 6.4.4+, and as long as your connection string's user has the ability to create new databases, it works better if one is not existing initially.

Once, I did all of the above, it seemed to work. So now I can at least move forward. Hopefully we can figure out the cause of the plural / singular discrepancy in the future.

Thanks to everyone for their time and effort.

查看更多
登录 后发表回答