Entity Framework не создает таблицу в БД - PullRequest
0 голосов
/ 06 мая 2011

Итак, во-первых, я не знаю, какую версию Entity Framework я использую.Я предполагаю, что его 4, но как я могу проверить?

Во-вторых, у меня есть следующая строка подключения в web.config:

  <connectionStrings>

<add name="DBEntites"
     connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
     providerName="System.Data.SqlClient" />

<add name="ApplicationServices"
     connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
     providerName="System.Data.SqlClient" />

Как вы можете видеть, это одна и та же БД.Фактически это БД, созданная поставщиком членства asp.net.

Теперь у меня есть следующая модель:

public class Profile {
    [Key]
    public string username { get; set; }

    [Display(Name = "Full Name")]
    public string FullName { get; set; }

}

Достаточно просто?

Тогда у меня есть следующий класс, который подключается к БД:

   public class DBEntities : DbContext {
        public DbSet<Profile> Profiles { get; set; }
    }

Затем в моем контроллере учетных записей, на самом деле, это тот же контроллер, созданный VS2010 при выборе нового проекта MVC3.

 [HttpPost]
 public ActionResult  Register(RegisterModel model) {
            if (ModelState.IsValid) {
                // Attempt to register the user
                MembershipCreateStatus createStatus;
                Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);
                Profile pm = new Profile();
                pm.username=model.UserName;
                pm.FullName="unknown";

                db.Profiles.Add(pm);
                db.SaveChanges();



                if (createStatus == MembershipCreateStatus.Success) {
                    FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
                    return RedirectToAction("Index", "Home");
                } else {
                    ModelState.AddModelError("", ErrorCodeToString(createStatus));
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

ТАК, когда я запускаю это приложение, оно запускается без исключений.Если я добавлю нового пользователя, новый пользователь будет добавлен в таблицы членства asp.net.Поэтому, насколько я понимаю, платформа Entity должна создать таблицу с именем «Профиль» с двумя столбцами «имя пользователя» и «полное имя».

Однако это не так.Почему код может проходить без исключений, может проходить db.SaveChanges(), а таблица еще не создана?

Что я делаю не так?

edit: Я думаю, что таблица существует, потому что, если я пытаюсь создать запись с тем же именем пользователя (очевидно, не могу, так как это первичный ключ), она выдает исключение, сообщающее, что запись уже существует.

НО я не могу найти стол!

1 Ответ

4 голосов
/ 06 мая 2011

Вы используете EF 4.1 и ожидаемое поведение. Вы используете существующую базу данных, и в этом случае EF не будет создавать таблицы для вас. EF с функциями по умолчанию может создавать базу данных и все таблицы только вместе. Членский API не использует EF, поэтому ваш второй тест не пройден при членстве (имя пользователя должно быть уникальным), а не при EF.

Чтобы решить вашу проблему, вы должны либо создать таблицы в базе данных вручную, либо позволить EF создать базу данных, что будет немного сложнее, поскольку для этого вам придется создавать все связанные таблицы ASP.NET. Один из способов сделать это - записать эти таблицы во внешний файл SQL и выполнить этот файл в пользовательском инициализаторе. Для пользовательского инициализатора проверьте этот ответ . Этот способ не любит скрипты, содержащие команду GO. Если вы хотите использовать сценарий с командой GO, вы должны использовать Объекты управления SQL Server для выполнения сценария (SMO).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...