Entity Framework стварае множны імя табліцы, але выгляд чакае сінгулярнасць імя табліцы?

Я выкарыстоўваю раз'ём 6.4.4.0 і Entity кадраў MySQL .net працы 4.1 і спрабуе стварыць самы асноўны код Па-першае рэалізацый.

public class myDB: DbContext
{
    public DbSet 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

@{
    ViewBag.Title = "Index";
}

Index

@Html.ActionLink("Create New", "Create")

<table> <tr> <th> @Html.DisplayNameFor(model => model.Value) </th> <th></th> </tr> @foreach (вар элемент у мадэлі) { <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/множнага Sight/гу ня Скот апрацоўваць з дапамогай MySQL, так што я павінен прадставіць сабе, што .netconnector можа быць вінаватым. Я хацеў бы таксама, каб пазбегнуць выкарыстання [Table ( «Голас»)] атрыбуты. У асноўным я спадзяюся, як шмат з «са скрынкі» рашэнні, як гэта магчыма.

edit2 (некаторыя больш адпаведны код): калі я выдаліць гэта ... Табліцы не ў стане стварыць усе разам. але выгляд кідае выключэнне шукае «галасы» не «галасавання». у global.asax

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

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

public class myDBInitializer : DropCreateDatabaseAlways
{
    protected override void Seed(myDBcontext)
    {
        base.Seed(context);
    }
}
28
@cwyers: Калі гэта не занадта позна, я чуў ад нашых мясцовых DBA і прачытаць, што гэта добрая практыка DB захаваць імёны табліц адзіночнага ліку.
дададзена аўтар Merlyn Morgan-Graham, крыніца
Ці ёсць з дапамогай функцыі Табліца атрыбут вырашыць гэтую праблему? Вы можаце таксама выкарыстоўваць свабодна API, калі вам не падабаецца гэты атрыбут. Ці спрабавалі вы гэта з SQL Express? Можа быць, ёсць праблема з раздымам MySQL
дададзена аўтар flipchart, крыніца
Я не ведаю, MySQL наогул, так што я магу толькі спытаць, калі вы 100% упэўненыя, што табліца ў MySQL называецца «голас», а не «галасаваць»
дададзена аўтар flipchart, крыніца
я на самой справе проста паспрабаваў дадаць [Table ( «Голас»)] вышэй класа Галасуй, а праблема застаецца. і няма, я паспрабаваў няма з SQLExpress, таму што мне трэба, каб прымусіць яго працаваць з MySQL :-)
дададзена аўтар nograde, крыніца
пс. што робіць атрыбут табліцы мае значэнне Галасуйце, выпраўляе гэтую праблему. Чаму выгляд чакаць няправільнае імя табліцы !! ?? :(
дададзена аўтар nograde, крыніца
Угу, толькі ўваход на сервер і праверылі дб. вызначана названыя «галасы».
дададзена аўтар nograde, крыніца

6 адказы

Таму я адмовіўся ад спрабую зрабіць гэта так, як я адчуваў, што гэта павінна быць зроблена і выдаленая плюрализация ўсе разам. Я не ведаю напэўна, але я мяркую, што праблема звязаная з падтрымкай .net злучальніка MySQL ў ФВ. Вось што я зрабіў.

Па-першае, там была памылка ў маім метадзе ApplicationStart:

//WRONG
//Database.SetInitializer(new DropCreateDatabaseAlways());
Database.SetInitializer(new myDBInitializer());

Па-другое, я перастаў называць базавую рэалізацыю OnModelCreating, які не пазначаны ў зыходным кодзе, так як я толькі рэалізаваць яго згодна з прапановай jgauffin у:

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

Па-трэцяе, я чытаў у некаторых паведамленьняў пра тое, што MySQL Connector .net не дазваляе EF фактычна стварыць базу дадзеных, таму я першапачаткова стварыў пустую БД. Гэта, здаецца, больш не быць у выпадку з раздымам 6.4.4+, і да таго часу, як карыстальнік вашай радкі падлучэння мае магчымасць ствараць новыя базы дадзеных, ён працуе лепш, калі ён не існуе першапачаткова.

Пасля таго, як я зрабіў усё вышэй, здавалася, на працу. Так што цяпер я магу па крайняй меры, рухацца наперад. Спадзяюся, мы зможам высветліць прычыну множнага/адзіночнага ліку разыходжанняў ў будучыні.

Дзякуй усім за іх час і намаганні.

42
дададзена
Дзякуючы гэта дапамагло мне. У выпадку, калі хтосьці атрымлівае наступнае паведамленне пра памылку: Немагчыма стварыць табліцу 'yourdb # SQL-440_4fa8. (Errno: 150) , гэта азначае, што вы забыліся выдаліць TableAttribute на адна з вашых мадэляў (памылка 150 з'яўляецца знешніх ключом, звязаных з).
дададзена аўтар Marthijn, крыніца

У вашым MyDB кантэксце класа, перавызначыць наступны метад

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

каб ён не множны лік згенераваных імёнаў табліц.

18
дададзена
О, вы на самой справе хочаце, множны лік імёнаў табліц. Вышэй, верагодна, дапаможа ў гэтым выпадку няма. Апісанае паводзіны гучыць як памылка ў пастаўшчыку MySQL EF.
дададзена аўтар Morten Mertner, крыніца
Вось ужо тлумачэнне паведамленні Morten. edspencer.me.uk/2012/03/13/& hellip;
дададзена аўтар Sameer, крыніца
я думаю, што вы маеце рацыю Мортэна.
дададзена аўтар nograde, крыніца

Выдаліць «або множны лік singularsize згенераваных імёнаў аб'ектаў» галачкі пры стварэнні аб'екта сутнасці.

enter image description here

8
дададзена
Вы не можаце з кодам першым.
дададзена аўтар jgauffin, крыніца
Гэты метад працуе, калі дадаць новы аб'ект сутнасці і паказаць яго ў існуючую схему базы дадзеных.
дададзена аўтар Dan, крыніца
Эй, Дэн, дзякуй за адказ. гэта літаральна мой першы праект MVC/EF і ім з дапамогай кода, першы падыход. Я не зусім упэўнены, як атрымаць доступ да меню, стваранаму скрыншот. Ці можаце вы прасьвятліць мяне? дзякуй!
дададзена аўтар nograde, крыніца

Адкрыйце 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();
}
7
дададзена

Вы павінны перавызначыць OnModelCreating ў вашым DbContext, каб паказаць імя табліцы:

modelBuilder.Entity().MapSingleType().ToTable("Votes")
3
дададзена
гэта лінія называюць? ўсталяваць кантрольную кропку
дададзена аўтар jgauffin, крыніца
Дзякуй! Галасуйце ўжо адлюстроўваюцца ў табліцу «ГАЛАСЫ», але я implimented гэта як раз, каб убачыць, калі гэта можа злучыць некалькі кропак у магіі «фонавы код» ФВ. Тым не менш, выключэнне шукае mydb.vote ўсё яшчэ кідаюць.
дададзена аўтар nograde, крыніца
гэта датэлефанаваліся.
дададзена аўтар nograde, крыніца

Калі вы выкарыстоўваеце Code First з EF 6.1 +, перавызначыць OnModelCreating падзея і зрабіць наступны выклік (ы):

dmbCloud.Conventions.Remove();
dmbCloud.Conventions.Remove();
2
дададзена