3

Я следил за учебником this, и я попытался добавить несколько новых столбцов в таблицу userprofile. И я попытался создать новую таблицу.Код сначала создает таблицы

public class UsersContext : DbContext 
{ 
    public UsersContext() 
     : base("DefaultConnection") 
    { 
    } 

    public DbSet<UserProfile> UserProfiles { get; set; } 
    public DbSet<TestTabel> TestTabel { get; set; } 
} 

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
    public string Mobile { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

[Table("TestTabel")] 
public class TestTabel 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int TestId { get; set; } 
    public string TestName { get; set; } 
    public string TestMobile { get; set; } 
} 

Чем я пытался обновить базу данных с помощью консоли с помощью команды обновления базы данных, и я получил эту Сообщ ошибки:

Там уже находится объект с именем «UserProfile» в базе данных.

Новые столбцы, где не добавлены, и ни таблица.

Что мне не хватает?

[EDIT] Я сделал команды надстройку миграции и обновление-базы данных, и это из приходят (пришлось сделать команду обновления-базы данных в два раза, 2-й раз с многословным)

PM> Add-Migration 
cmdlet Add-Migration at command pipeline position 1 
Supply values for the following parameters: 
Name: test 
Scaffolding migration 'test'. 
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration 201304011714212_test' again. 
PM> Update-Database 
The project 'MVC4SimpleMembershipCodeFirstSeedingEF5' failed to build. 
PM> Update-Database 
Specify the '-Verbose' flag to view the SQL statements being applied to the target database. 
Applying code-based migrations: [201304011714212_test]. 
Applying code-based migration: 201304011714212_test. 
Running Seed method. 
PM> Update-Database -verbose 
Using StartUp project 'MVC4SimpleMembershipCodeFirstSeedingEF5'. 
Using NuGet project 'MVC4SimpleMembershipCodeFirstSeedingEF5'. 
Specify the '-Verbose' flag to view the SQL statements being applied to the target database. 
Target database is: 'aspnet-MVC4SimpleMembershipCodeFirstSeedingEF5' (DataSource: ., Provider: System.Data.SqlClient, Origin: Configuration). 
No pending code-based migrations. 
Running Seed method. 
PM> 

[/EDIT]

Configuration.cs:

namespace MVC4SimpleMembershipCodeFirstSeedingEF5.Migrations 
{ 
    internal sealed class Configuration : DbMigrationsConfiguration<UsersContext> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = true; 
     } 

    protected override void Seed(UsersContext context) 
    { 
     WebSecurity.InitializeDatabaseConnection(
      "DefaultConnection", 
      "UserProfile", 
      "UserId", 
      "UserName", autoCreateTables: true); 

     if (!Roles.RoleExists("Administrator")) 
      Roles.CreateRole("Administrator"); 

     if (!WebSecurity.UserExists("test")) 
      WebSecurity.CreateUserAndAccount(
       "test", 
       "password", 
       new { Mobile = "+19725000374", FirstName = "test", LastName = "test" }); 

     if (!Roles.GetRolesForUser("test").Contains("Administrator")) 
      Roles.AddUsersToRoles(new[] { "test" }, new[] { "Administrator" }); 
    } 
    } 
} 

В CS файл папка Фильтры 1:

namespace MVC4SimpleMembershipCodeFirstSeedingEF5.Filters 
{ 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, 

    Inherited = true)] 
    public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute 
    { 
     private static SimpleMembershipInitializer _initializer; 
     private static object _initializerLock = new object(); 
     private static bool _isInitialized; 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      // Ensure ASP.NET Simple Membership is initialized only once per app start 
      LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); 
     } 
    private class SimpleMembershipInitializer 
    { 
     public SimpleMembershipInitializer() 
     { 
      Database.SetInitializer<UsersContext>(null); 

      try 
      { 
       using (var context = new UsersContext()) 
       { 
        if (!context.Database.Exists()) 
        { 
         // Create the SimpleMembership database without Entity Framework migration schema 
         ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); 
        } 
       } 

       WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
      } 
      catch (Exception ex) 
      { 
       throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex); 
      } 
     } 
    } 
    } 
} 

Строка соединения:

<configSections> 
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
</configSections> 

Последняя миграция:

namespace MVC4SimpleMembershipCodeFirstSeedingEF5.Migrations 
{ 
    using System; 
    using System.Data.Entity.Migrations; 

public partial class test : DbMigration 
{ 
    public override void Up() 
    { 
     CreateTable(
      "dbo.TestTabel", 
      c => new 
       { 
        TestId = c.Int(nullable: false, identity: true), 
        TestName = c.String(), 
        TestMobile = c.String(), 
       }) 
      .PrimaryKey(t => t.TestId); 

    } 

    public override void Down() 
    { 
     DropTable("dbo.TestTabel"); 
    } 
    } 
} 
+2

Привет, вы запустили 'Add-Migrations' [command] (http://msdn.microsoft.com/en-us/data/jj591621.aspx), чтобы подделать ваши изменения перед запуском' Update-Database' ? – nkvu

+0

Привет, да, я тоже это попробовал, забыл упомянуть об этом. Но это не сработало. – Yustme

ответ

14

Я просто хочу, чтобы бросить все здесь как проходные для получения вашего кода первым и миграция происходит- атакует различные проблемы, которые могут произойти или не произойти. Примечание: код-первый оказался очень надежным - и его можно разрабатывать и с живыми сценариями - вам просто нужно знать, что вы делаете.

Скорее всего, ваша миграция и база данных в основном не синхронизированы.

Ваша существующая миграция пытается работать против старой копии базы данных - с ups/downs, которые были оптимизированы для «пустой db», я думаю.

Вам необходимо выполнить миграцию (дополнение) к копии Db, к которой вы прикреплены, - это создаст «разницу» и просто обновит ваш Db (всегда убедитесь, что для резервного копирования, конечно, поскольку он может упасть/измениться и т. д.).

Или, если возможно, очистите свой Db - и затем начните новый.

Или если live Db - создать миграции - и запустите Update-Database -Script на вашей dev-машине - чтобы сгенерировать полный Db - или изменения (все это очень грубо, вам нужно приспособиться к вашему делу). И затем применитесь к вашему «живому Db», запустив скрипты.

Вы также можете проверить мой предыдущий пост на синхронизацию ...

MVC3 and Code First Migrations - "model backing the 'blah' context has changed since the database was created"

EDIT:
Также проверьте этот ответ AutomaticMigrationsEnabled false or true?

И если это нормально с вашим способом делать вещи добавить AutomaticMigrationsEnabled = true; вам Configuration (также под Миграцией папок - созданная для вас) ..

Пара шагов я всегда делаю для очистки миграций:

(хорошо сделать резервную копию первого)
- Enable-Миграции -force (первый раз только - это удаляет configuration.cs и любой «seed'-ки там!)
- AutomaticMigrationsEnabled = истина;
- удалить существующие миграции вручную из проекта (\ Миграции)
- восстановить проект в данный момент
- Add-Migration Initial
- Update-Database -Force -Verbose

... позже (последующие миграции):
- Add-Migration SomeOther1
- Update-Database -Force -Verbose
... предоставляя вам сохранить ваш Db в синхронизации - т.е. осторожны с 'перемещение Db вокруг', регулируя вручную и т.д. (и в в этом случае см. другой пост)

Пара другие вещи:

С PM консоли ...
- выберите свой проект из списка,
- убедитесь, что ваш «главный ехе» (позвонив по проекту данные/сборки - или что же проект, если консоль/приложение) - задан как проект «запуск»,
- всегда смотрите комментарии консоли - так как это может быть попытка создать и получить доступ к другому проекту.

соединения:

Посмотреть этот пост мой Migration does not alter my table
Короче говоря - ваше соединение называется как ваш контекст + ваш проект - если не указано иное. Он извлекается из вашего конструктора DbConfig или app.config (соединений). Убедитесь, что вы смотрите на «правильную базу данных» (то есть, что вы просматриваете через какого-то проводника и с каким кодом в первую очередь подключаетесь) могут быть две разные вещи).

Строительство:
Убедитесь, что ваш проект установлен в «конфигурации», чтобы построить автоматически - что может быть проблема тоже.

+0

Так что код сначала не делает это для меня, когда я запускаю добавления-миграции, а затем команду update-database из консоли автоматически? Я скорее делаю это из кода, чем озадачиваю скрипты. – Yustme

+0

да, это делает это для вас - но вы «пропустили шаг» где-то вдоль линии, поскольку по какой-то причине он явно не синхронизирован. Сценарий предназначен только для обновлений «живого сервера», а не для тестирования/dev и т. Д. Просто начните с «Add-Migration» еще раз - и посмотрите, что произойдет - если вы находитесь на локальной машине. Миграции делают много вещей для вас - но часто терпят неудачу, когда «перемещение вещей» на другую машину - «старый Db» должен был быть сделан и миграциями, поэтому он может просто «продолжить» миграцию. Если это не так. – NSGaga

+0

вы живые или местные? Если локально, вы можете просто попытаться удалить (сначала создать резервную копию) db, и он должен воссоздать его для вас (так как это, очевидно, тест для вас, который проще всего). Таким образом, шаги - удалить Db, удалить все файлы миграции (все файлы ##### ... cs в папке Migrations) - перестроить проект - затем «Добавить-миграцию» - затем обновить-Database -verbose - и проверить миграцию cs и сгенерированный скрипт - вы можете опубликовать это - это легко разрешить, если только удаленный – NSGaga

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