2011-10-28 24 views
6

Tengo 2 entidades de usuario y perfil de usuario (relación uno a uno). Los he vinculado como sigue:Inserciones de claves externas de Entity Framework con ID automático

public class User 
{ 
    [Key] 
    [ForeignKey("user_profile")] 
    public int user_id {get;set;} 

    public string username {get;set;} 
    public string email {get;set;} 

    public virtual User_Proile user_profile {get;set;} 
} 


public class User_Profile 
{ 
    [Key] 
    public int user_id {get;set;} 

    public string firstname {get;set;} 
    public string lastname {get;set;} 
} 

user_id es una PK en las tablas de usuario y user_profile tanto de SQL Server. También se establece como una columna de Identidad en la tabla de Usuario.

Cuando intento insertar un nuevo registro a través de EFDBContext Add/SaveChanges. Me aparece el siguiente error: "user_id no puede ser NULL en la tabla User_Profile" Esto tiene mucho sentido ya que se trata de una columna PK. Esperaba que EF pudiera tomar Identity user_id de Users e Insertarlo en User_Profile user_id al guardar.

¿Es esto posible y, de ser así, cómo lo implementaría?

ACTUALIZACIÓN: Tenga en cuenta que he creado manualmente las tablas de bases de datos y las clases de código, por lo que no tengo acceso a StoreGeneratedPattern a través del archivo .edmx.

Respuesta

7

Creo que es necesario configurar el uno-a-uno explícitamente utilizando la API de Fluido:

public class MyContext : DbContext 
{ 
    // ... your DbSets 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>() 
      .HasRequired(u => u.user_profile) 
      .WithRequiredPrincipal(); 
    } 
} 

Y las clases de entidad:

public class User 
{ 
    [Key] 
    public int user_id {get;set;} 
    public string username {get;set;} 
    public string email {get;set;} 
    public virtual User_Profile user_profile {get;set;} 
} 

public class User_Profile 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int user_id {get;set;} 
    public string firstname {get;set;} 
    public string lastname {get;set;} 
} 

Es necesario apagar DatabaseGeneratedOption desde Identity hasta None en una de las clases. He cambiado el principal y el dependiente ya que parece que el User debería ser el principal. El [ForeignKey(...)] no es necesario porque EF reconocerá user_id en User_Profile como propiedad FK al User.

un código como este ...

using (var context = new MyContext()) 
{ 
    var user = new User(); 
    var userProfile = new User_Profile(); 

    user.user_profile = userProfile; 

    context.Users.Add(user); 
    context.SaveChanges(); 
} 

... entonces debería funcionar como se espera y guardar ambas entidades relacionadas con la base de datos.

+0

¡Guau! Eso funcionó EXACTAMENTE como dijiste que sería. ¡Muchas gracias Slauma! – chrisg229

0

usted tiene que fijar el StoreGeneratedPattern atributo de Identidad en su archivo .edmx para dejar el marco conocen el campo es generado por la base de datos. Este enlace puede ayudar ...

Autonumber with Entity Framework

+1

Acabo de hacer una búsqueda y no hay ningún archivo .edmx en el directorio de mi aplicación. Estoy usando EF4. ¿Me estoy perdiendo de algo? – chrisg229

+0

Umm, debería estar allí. El archivo .edmx es básicamente el modelo que generó, así que busque un archivo con ese nombre. O puede simplemente hacer clic derecho en el modelo en su explorador de soluciones y abrirlo con el editor xml. –

+0

No puedo encontrar ningún archivo .edmx y lo más parecido que tengo a un modelo son los archivos class.cs que creé. Tenga en cuenta que sí creé manualmente la tabla DB y las clases (haciendo que los nombres de las propiedades/columnas sean los mismos), luego hice una instancia del DBContext y realicé la conexión correcta en el web.config. Todo parece funcionar bien ... excepto el problema de identidad anterior. – chrisg229

Cuestiones relacionadas