Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework creates a plural table name, but the view expects a singular table name?

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);
    }
}
like image 504
nograde Avatar asked Oct 28 '11 03:10

nograde


4 Answers

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.

like image 192
nograde Avatar answered Nov 02 '22 13:11

nograde


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.

like image 26
Morten Mertner Avatar answered Nov 02 '22 14:11

Morten Mertner


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>();
}
like image 12
Bartho Bernsmann Avatar answered Nov 02 '22 14:11

Bartho Bernsmann


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

enter image description here

like image 10
Dan Avatar answered Nov 02 '22 14:11

Dan