programing

Entity Framework가 여러 개의 테이블 이름을 생성하지만 보기에서 하나의 테이블 이름이 필요합니까?

powerit 2023. 9. 20. 20:46
반응형

Entity Framework가 여러 개의 테이블 이름을 생성하지만 보기에서 하나의 테이블 이름이 필요합니까?

저는 MySQL .net 커넥터 6.4.4.0과 Entity Framework 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'.'투표'는 존재하지 않습니다."

edit : 분명히 말씀드리면, 저는 실제로 테이블의 다원화를 원하는데, 테이블을 제대로 만드는 것 같습니다.저는 단수/복수 불일치의 이유를 찾고 싶습니다.microsoft / Public Sight / scott gu의 튜토리얼과 비디오 중에 mysql을 사용하는 것을 다루지 않기 때문에 .netconnector가 범인일 수도 있다고 상상해야 합니다.[Table("Votes")] 속성을 사용하는 것도 피하고 싶습니다.기본적으로 저는 가능한 한 많은 '공개적인' 해결책을 기대하고 있습니다.

edit2(일부 관련 코드): 이 코드를 제거하면... tables가 모두 함께 만들지 못합니다. 그러나 보기에서 예외가 발생하여 'vote'가 아닌 'votes'를 찾습니다.범세계적으로

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);
    }
}

그래서 저는 제가 생각하는 대로 하려고 하는 것을 포기하고 다같이 다원화를 제거했습니다.확실히는 모르겠지만, mysql .net 커넥터의 EF 지원과 관련된 문제인 것 같습니다.제가 한 일은 이렇습니다.

첫째, 내 ApplicationStart 메서드에 버그가 있었습니다.

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

둘째, 저는 원래 코드에 나열되지 않은 OnModel Creating base 구현을 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 Connector가 EF가 실제로 데이터베이스를 생성하지 못하게 한다고 읽었으므로 처음에는 빈 DB를 생성했습니다.이는 커넥터 6.4.4+에서는 더 이상 해당되지 않는 것으로 보이며, 연결 문자열의 사용자가 새 데이터베이스를 만들 수 있는 기능을 가지고 있는 한 처음에 데이터베이스가 존재하지 않는 경우에는 더 잘 작동합니다.

일단 위의 모든 것을 해보니 효과가 있는 것 같았습니다.그래서 이제 적어도 앞으로 나아갈 수 있습니다.우리가 앞으로 복수/단수 불일치의 원인을 알아낼 수 있기를 바랍니다.

모든 분들의 시간과 노력에 감사드립니다.

myDB 컨텍스트 클래스에서 다음 메서드를 재정의합니다.

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

생성된 테이블 이름을 복수화하지 않도록 합니다.

open 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>();
}

도면요소 객체를 작성할 때 "생성된 객체 이름을 복수화 또는 단수화" 확인란을 제거합니다.

enter image description here

테이블 이름을 지정하려면 DbContext에서 OnModelCreating을 재정의해야 합니다.

modelBuilder.Entity<Vote>().MapSingleType().ToTable("Votes")

EF 6.1 +와 함께 Code First를 사용하는 경우 OnModelCreating 이벤트 핸들러를 재정의하고 다음 호출을 수행합니다.

dmbCloud.Conventions.Remove<PluralizingEntitySetNameConvention>();
dmbCloud.Conventions.Remove<PluralizingTableNameConvention>();

언급URL : https://stackoverflow.com/questions/7924758/entity-framework-creates-a-plural-table-name-but-the-view-expects-a-singular-ta

반응형