36

我正在使用 MySQL .net 连接器 6.4.4.0 和 Entity Frame work 4.1 并尝试创建最基本的代码优先实现。

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

我的模型

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

我的家庭控制器

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

我的强类型视图(使用列表脚手架)

@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>

它在 mySQL 中创建具有所有正确属性的表“投票”。

但是,它抛出了这一行:

@foreach(模型中的变量项)

有这个特例:

“表 'mydb.vote' 不存在”

编辑:为了澄清,我实际上想要表格复数,并且似乎可以正确创建表格。我希望找出单数/复数差异的原因。microsoft / Plural Sight / scott gu 的教程和视频都没有使用 mysql,所以我不得不想象 .netconnector 可能是罪魁祸首。我还想避免使用 [Table("Votes")] 属性。基本上,我希望尽可能多地提供“开箱即用”的解决方案。

edit2(一些更相关的代码):当我删除这个......表无法一起创建。但视图抛出一个异常寻找“投票”而不是“投票”。在 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);
    }
}
4

6 回答 6

48

所以我放弃了尝试按照我认为应该做的方式去做,并一起删除了多元化。我不确定,但我认为问题与 mysql .net 连接器对 EF 的支持有关。这就是我所做的。

首先,我的 ApplicationStart 方法中有一个错误:

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

其次,我停止调用原始代码中未列出的 OnModelCreating 基本实现,因为我只是按照 jgauffin 的建议实现了它:

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

第三,我在一些帖子中读到 MySQL .net 连接器不允许 EF 实际上创建数据库,所以我最初创建了空白数据库。连接器 6.4.4+ 似乎不再是这种情况,只要您的连接字符串的用户能够创建新数据库,如果最初不存在数据库,它会更好地工作。

有一次,我做了以上所有,它似乎工作。所以现在我至少可以前进了。希望我们将来能找出复数/单数差异的原因。

感谢大家的时间和精力。

于 2011-10-28T11:31:08.080 回答
22

在您的 myDB 上下文类中,覆盖以下方法

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

让它不复数生成的表名。

于 2011-10-28T07:57:37.420 回答
12

打开DbContext与要保留单数表名的表相关的类。

如果您使用的是 EF 6,请添加对以下内容的引用:

using System.Data.Entity.ModelConfiguration.Conventions;

如果是旧版本,请添加对以下内容的引用:

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

最后创建一个方法来覆盖OnModelCreating并删除复数表名的约定:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
于 2016-03-11T04:28:15.923 回答
10

创建实体对象时删除“Pluralize or singlesize generated object names”复选标记。

在此处输入图像描述

于 2011-10-28T03:22:33.153 回答
3

您需要在 DbContext 中覆盖OnModelCreating以指定表名:

modelBuilder.Entity<Vote>().MapSingleType().ToTable("Votes")
于 2011-10-28T04:02:21.137 回答
3

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>();
于 2014-12-26T21:45:06.737 回答