2013-04-14 2 views
-1

Итак, вот краткий обзор. Я использую Code First, новую базу данных.Невозможно правильно создать контроллер с помощью платформы Entity Framework

Overview

Как вы видите, я создал модель AccountModels (то же самое имя, как по умолчанию в случае, если кто запутался). Это выглядит следующим образом:

public class User 
{ 
    public int UserId { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 
    public string Email { get; set; } 
    public virtual ICollection<Stat> Stats { get; set; } 
} 

public class Stat 
{ 
    public int StatId { get; set; } 
    public string Age { get; set; } 
    public string Height { get; set; } 
    public string Weight { get; set; } 
    public bool Sex { get; set; } 

    public int UserId { get; set; } 
    public virtual User User { get; set; } 
} 

public class BodylogDbContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Stat> Stats { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     Database.SetInitializer<BodylogDbContext>(null); 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    } 
} 

Теперь, когда я пытаюсь добавить контроллер я не могу выбрать свой класс модели, AccountModel. Насколько я помню, я должен был бы выбрать класс модели, а затем в следующем поле я выбираю класс данных данных, который есть - BodylogDbContext (Bodylog.Models), и все должно быть установлено. Но я не могу, почему?

Create controller

И вот моя строка соединения.

<add name="BodylogDbContext" 
    connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Bodylog.mdf;Integrated Security=True" 
    providerName="System.Data.SqlClient" 
/> 
+1

выглядит хорошо для меня. 'AccountModels' выглядит так, что это просто имя файла, а не класс. В раскрывающемся списке вы увидите имена публичных классов. 'Stat' и' Пользователь' есть. Что вы ожидаете от падения? –

+0

Я думал, что это должно показать AccountModels? Мне кажется неправильным, что я должен выбрать 'User' или' Stat', так как они такие же, если вы знаете, что я имею в виду? ehh:/ – brk

+0

Что вы подразумеваете под «тем же»? Извините, я точно не знаю, что вы имеете в виду. ;) Физический файл, в который вы помещаете свои классы, не имеет никакого отношения к тому, как скомпилирован код. В этом случае, после компиляции, C# не знает ваш файл AccountModels.cs. Выпадающий список показывает отраженный вид скомпилированной сборки. –

ответ

0

Все работает как ожидается. Одна из проблем заключается в том, что в образце проекта предоставляется файл AccountModels.cs, содержащий несколько классов моделей. Конвенция диктует, что на самом деле их можно разделить на несколько файлов, один файл на класс и названный в честь класса.

В вашем проекте нет класса AccountModels, поэтому он не представляется в качестве опции для модели.

+0

Вещь, которая создает пух в моей голове, состоит в том, что 'Stat' должен быть _part_' User'. Поэтому, если я использую EF для создания CRUD-операций для меня, он не будет включать 'Stat'. Я думал, что следую конвенции, когда я назвал класс AccountModels, а затем создаю Controller 'AccountController', что раздражает меня, потому что тогда я могу выбрать только класс« Пользователь »или« Стат », а не класс AccountModels. – brk

0

Наличие файла .cs не создает «подразумеваемый» класс. Вы увидите только типы, которые имеют конкретные определения в раскрывающемся списке. Таким образом, если вы хотите иметь родительский класс AccountModel (где все остальные POCO которые определяют свойства этой модели), вам нужно что-то вроде:

public class AccountModel 
{ 
    public User UserModel { get; set; } 
    public Stat StatModel { get; set; } 
} 

Так что ваша модель Razor привязки будет выглядеть примерно так:

@model Your.Fully.Qualified.Namespace.AccountModel

Вы бы привязать к свойствам пользователей этой модели, как это:

@Html.EditorFor(m => m.UserModel.Email)

+0

Как это работает? Я получаю [эту ошибку] ​​(http://uppic.dk/di/TTS8/Unavngivet.png). – brk

+0

@twice 'AccountModel' не будет классом EF - единственная цель - объединить классы' User' и 'Stat', чтобы привязка модели имела конкретный класс для работы.Хотя, теперь, когда я действительно выгляжу немного ближе, ваш класс 'User' фактически содержит дочернюю коллекцию объектов Stat. Вы просто пытаетесь создать «редактирование пользователя»? –

+0

Да, 'Пользователь' имеет дочерний объект,' Stat'. Когда я позволяю EF создавать CRUD-операции для 'User'. Я перейду к ** localhost: 12345/Account/Create **, и он перечислит уважаемые свойства из 'User', _Username_, _Password_ и _Email_, однако я бы хотел, чтобы EF включил статистику. Хотя я предполагаю, что смог бы добавить их там вручную как-то в файлы View. ** РЕДАКТИРОВАТЬ: ** Не могли бы вы также знать, нужно ли в этой строке ключевое слово _virtual_? 'Stat' -' public virtual User User {get; задавать; } ' – brk

Смежные вопросы