c# - tutorial - mvc 5 entity framework relationships
Código primero crear tablas (1)
Voy a presentar todo aquí como un recorrido para obtener su código primero y las migraciones en marcha , atacando varios problemas que pueden suceder o no. Nota: Code-First ha demostrado ser muy confiable, y también se puede resolver con escenarios en vivo, solo necesita saber lo que está haciendo.
Lo más probable es que su migración y la base de datos estén básicamente fuera de sincronización.
Su migración actual intenta ejecutarse contra la copia anterior de la base de datos, con altas y bajas que fueron optimizadas para el ''db vacío'', supongo.
Debe ejecutar sus migraciones (Agregar-Migración) contra la copia del archivo Db al que se está conectando, eso creará una "diferencia" y actualizará su Db (siempre asegúrese de hacer una copia de seguridad, por supuesto, ya que podría caer / cambiar, etc.).
O si es posible, vacíe su Db - y luego comience de nuevo.
O si se Update-Database -Script
Db en vivo -crear migraciones- y ejecutar Update-Database -Script
en su dev-machine -para generar el Db completo- o los cambios (todo esto es muy difícil, debe ajustarse a su caso). Y luego aplicar a su ''Live Db'' ejecutando scripts.
También puedes consultar mi publicación anterior sobre la sincronización ...
EDITAR:
También verifique esta respuesta AutomaticMigrationsEnabled ¿falso o verdadero?
Y si está bien con su forma de hacer las cosas, agregue AutomaticMigrationsEnabled = true;
Configuration
(también en la carpeta Migraciones - creada para usted) ..
Pasos de pareja que siempre hago para limpiar migraciones:
(bueno para hacer una copia de seguridad primero)
- Enable-Migrations -force (solo por primera vez) ¡esto borra los configuration.cs y cualquier ''seed''-ing''!
- AutomaticMigrationsEnabled = true;
- eliminar las migraciones existentes a mano del proyecto (/ Migrations)
- reconstruir el proyecto en este punto
- Ingreso de migración adicional
- Actualización-Base de datos -Fuerza -Verbose
... más adelante (migraciones posteriores):
- Agregar-Migración SomeOther1
- Actualización-Base de datos -Fuerza -Verbose
... lo que le permite mantener su Db sincronizado, es decir, tener cuidado con ''mover Db alrededor'', ajustar manualmente, etc. (y en ese caso, ver la otra publicación)
Juntar otras cosas:
Con PM Console ...
- selecciona tu proyecto de la lista,
- Asegúrese de que su ''principal'' (que llama a su proyecto / ensamblado de datos - o ese mismo proyecto si es una consola / aplicación) - está configurado como proyecto de ''inicio'',
- siempre mire los comentarios de la consola - ya que puede estar intentando construir y acceder a diferentes proyectos.
Conexión:
Ver este post mío La migración no altera mi mesa
En resumen, su conexión se denomina como su contexto + su proyecto, si no se especifica lo contrario. Se basa en su constructor DbConfig - o en app.config (conexiones). Asegúrate de estar viendo la "base de datos correcta" (es decir, lo que buscas a través de un explorador y a qué código se conecta primero) pueden ser dos cosas diferentes).
Edificio:
Asegúrate de que tu proyecto esté configurado en ''configuración'' para compilar automáticamente; eso también puede ser un problema.
Estaba siguiendo este tutorial e intenté agregar algunas columnas nuevas en la tabla de perfil de usuario. Y traté de crear una nueva tabla.
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; }
}
Luego intenté actualizar la base de datos con la consola con el comando update-database, y recibí este mensaje de error:
Ya hay un objeto llamado ''UserProfile'' en la base de datos.
Las nuevas columnas no se agregaron, y tampoco la tabla.
¿Qué me estoy perdiendo?
[EDIT] Hice los comandos add-migration y update-database, y este es el resultado (tuvo que hacer el comando update-database dos veces, la segunda vez con verbose)
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>
[/EDITAR]
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" });
}
}
}
En la carpeta de filtros 1 archivo cs:
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);
}
}
}
}
}
Cadena de conexión:
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
Última migración:
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");
}
}
}