nog*_*ade 29 c# mysql entity-framework-4 ef-code-first asp.net-mvc-4
我使用MySQL .net连接器6.4.4.0和实体框架工作4.1并尝试创建最基本的代码优先实现.
public class myDB: DbContext
{
public DbSet<Vote> Votes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的模特
public class Vote
{
public Guid Id { get; set; }
public int Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的家庭控制员
public class HomeController : Controller
{
myDB_db = new myDB();
public ActionResult Index()
{
var model = _db.Votes;
return View(model);
}
}
Run Code Online (Sandbox Code Playgroud)
我的强类型视图(使用List脚手架)
@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>
Run Code Online (Sandbox Code Playgroud)
它在mySQL中使用所有正确的属性创建表'votes'.
然而,它抛出这一行:
@foreach(模型中的var项)
有这个特例:
"表'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);
}
}
Run Code Online (Sandbox Code Playgroud)
nog*_*ade 46
所以我放弃了尝试按照我认为应该完成的方式去做,并一起去除多元化.我确实不知道,但我认为问题与mysql .net连接器对EF的支持有关.这就是我做的.
首先,我的ApplicationStart方法中存在一个错误:
//WRONG
//Database.SetInitializer(new DropCreateDatabaseAlways<myDB>());
Database.SetInitializer(new myDBInitializer());
Run Code Online (Sandbox Code Playgroud)
其次,我停止调用原始代码中未列出的OnModelCreating基础实现,因为我只根据jgauffin的建议实现了它:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//DONT DO THIS ANYMORE
//base.OnModelCreating(modelBuilder);
//modelBuilder.Entity<Vote>().ToTable("Votes")
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
Run Code Online (Sandbox Code Playgroud)
第三,我在一些帖子中读到MySQL .net连接器不允许EF实际创建数据库,所以我最初创建了空白数据库.连接器6.4.4+似乎不再是这种情况,并且只要您的连接字符串的用户具有创建新数据库的能力,如果最初不存在,则它会更好.
有一次,我做了以上所有,似乎工作.所以现在我至少可以前进了.希望我们能够找出未来复数/奇异差异的原因.
感谢大家的时间和精力.
Mor*_*ner 20
在myDB上下文类中,重写以下方法
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
base.OnModelCreating(modelBuilder);
}
Run Code Online (Sandbox Code Playgroud)
让它不复数生成的表名.
打开DbContext与要保留单个表名的表相关的类.
如果您使用的是EF 6,请添加对以下内容的引用:
using System.Data.Entity.ModelConfiguration.Conventions;
Run Code Online (Sandbox Code Playgroud)
如果是旧版本,请添加对以下内容的引用:
using System.Data.Entity.ModelConfiguration.Conventions.Edm.Db;
Run Code Online (Sandbox Code Playgroud)
最后创建一个方法来覆盖OnModelCreating和删除约定以复数表名:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
Run Code Online (Sandbox Code Playgroud)