2010-12-10 17 views
5

tuve Código EF Primera CTP4 trabajando bien, y he instalado CTP5 hoy. Ahora, recibo una excepción cuando mi base de datos se vuelve a llenar.EF4 Código Primera CTP5: Método de semillas ya no funciona

Aquí es mi modelo:

public class Member 
{ 
    public Member() 
    { 
     DateCreated = DateTime.Now; 
     DateUpdated = DateTime.Now; 
     DateLastLogin = DateTime.Now; 
    } 
    [Key, DatabaseGenerated(DatabaseGenerationOption.Identity)] \\I have tried removing these annotations and the result is the same 
    public int MemberId { get; set; } 
    [Required,RegularExpression(".+\\@.+\\..+", ErrorMessage = "Please enter a valid email address")] 
    public string Email { get; set; } 
    [Required,StringLength(20,MinimumLength=2)] 
    public string FirstName { get; set; } 
    [Required, StringLength(20, MinimumLength = 2)] 
    public string LastName { get; set; } 
    [Required, StringLength(36, MinimumLength = 2)] 
    public string City { get; set; } 
    [Required, StringLength(20, MinimumLength = 2)] 
    public string State { get; set; } 
    [Required, StringLength(20, MinimumLength = 2)] 
    public string Zip { get; set; } 
    public double GeoLat { get; set; } 
    public double GeoLong { get; set; } 
    public string AccountStatus { get; set; } 
    public DateTime DateCreated { get; private set; } 
    public DateTime DateUpdated { get; set; } 
    public DateTime DateLastLogin { get; set; } 

    public virtual PublicProfile Profile { get; set; }   
} 

Este es el código que se está llamando en Global.asax.cs

protected void Application_Start() 
{   
    RegisterRoutes(RouteTable.Routes); 
    DbDatabase.DefaultConnectionFactory = new SqlConnectionFactory("System.Data.SqlClient"); 
    DbDatabase.SetInitializer<MeetPplDB>(new Initializer()); 
} 

public class Initializer : DropCreateDatabaseAlways<MeetPplDB> 
{ 
    protected override void Seed(MeetPplDB context) 
    { 
     var Members = new List<Member> 
     { 
      new Member { 
       Email = "[email protected]", 
       City = "San Francisco", 
       AccountStatus = "Active", 
       State = "CA", 
       FirstName = "David", 
       LastName = "Daverson", 
       Zip = "94118", 
       GeoLat = 37.735, 
       GeoLong = -122.392 }, 

      new Member { 
       Email = "[email protected]", 
       City = "Oakland", 
       AccountStatus = "Active", 
       State = "CA", 
       FirstName = "Bob", 
       LastName = "Boberson", 
       Zip = "94601", 
       GeoLat = 37.781, 
       GeoLong = -122.216 }, 

      new Member { 
       Email = "[email protected]", 
       City = "San Francisco", 
       AccountStatus = "Active", 
       State = "CA", 
       FirstName = "Jenny", 
       LastName = "Jennerson", 
       Zip = "94123", 
       GeoLat = 37.735, 
       GeoLong = -122.392 } 
     }; 
     Members.ForEach(m => context.Members.Add(m)); 
     context.SaveChanges(); 
    } 
} 

cuando golpea el SaveChanges en el contexto, me sale esta excepción :

detectado cambios conflictivos. Esto puede suceder cuando se intenta insertar varias entidades con la misma clave.

Descripción: Se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.

Detalles de la excepción: System.Data.UpdateException: Conflicto en los cambios detectados. Esto puede suceder cuando se intenta insertar varias entidades con la misma clave.

¿Alguien tiene alguna idea de qué ha cambiado y por qué esto ya no funciona? ¿Qué necesita cambiar para que esto funcione?

+0

no puedo ver nada malo en su código o reproducir el problema. Lo siento, buena suerte. – Paul

+0

Estoy siguiendo [esta serie] (http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-1-introduction- and-model.aspx) en CTP5, y mi inicializador no tiene ninguna llamada 'SaveChanges', pero aún llena correctamente la base de datos. ¿Quizás algo entre CTP4 y CTP5 cambió con respecto a dónde se guardan los cambios para un inicializador? – ProfK

Respuesta

0

La razón de su excepción es que usted tiene int tipo de datos combinada con DatabaseGenerationOption.Identity. El uso de identidad generará un guid y no una clave int.

Tengo un problema similar porque quiero tener una clave de tipo int y un GUID como un rowid único. Y la semilla deja de funcionar si uso ambos en una entidad, incluso si están en accesorios separados.

+0

sin embargo, encontró alguna solución para eso? tengo exactamente el mismo problema en este momento. –

0

Tal vez debido a que su nombre de la variable que se utiliza se ha generado como pluralizado por EF.

En lugar de:

public class Initializer : DropCreateDatabaseAlways<MeetPplDB> 
{ 
    protected override void Seed(MeetPplDB context) 
    { 
     var Members = new List<Member> 
     { 
      new Member { 
       Email = "[email protected]", 
       City = "San Francisco", 
..... 

probar esto

public class Initializer : DropCreateDatabaseAlways<MeetPplDB> 
{ 
    protected override void Seed(MeetPplDB context) 
    { 
     var _members = new List<Member> 
     { 
      new Member { 
       Email = "[email protected]", 
       City = "San Francisco", 

.... 


_members.ForEach(m => context.Members.Add(m)); 
     context.SaveChanges(); 

comparo su código con Scott Gu de http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

Cuestiones relacionadas