2011-03-04 21 views
9

Estoy tratando de crear una primera aplicación de código de entidad simple. Tengo estas clases:¿Cómo obtener el código de Entity Framework? ¿Funcionan las primeras y las propiedades de claves foráneas que aceptan nulos?

public class User 
{ 
    public int UserId { get; set; } 

    public string Username { get; set; } 

    public virtual ActivationTicket ActivationTicket { get; set; } 
} 

public class ActivationTicket 
{ 
    public int ActivationTicketId { get; set; } 

    public virtual User User { get; set; } 

    public string Ticket { get; set; } 
} 

Cuando intento crear un nuevo usuario y guardarla en la base de datos (un usuario sin una ActivationTicket que es) recibo una excepción

La sentencia INSERT en conflicto con la restricción FOREIGN KEY "ActivationTicket_User". El conflicto ocurrió en la base de datos "Test", tabla "dbo.ActivatioTickets", columna "ActivationTicketId". La instrucción se ha terminado.

Asumo EF trata el mapeo entre el Usuario y ActivationTicket como 1-1, pero debería ser 1-0..1

¿Qué tengo que hacer para conseguir que esto funcione?

Respuesta

20

necesitará una regla de asignación de la siguiente manera:

 
modelBuilder 
    .Entity<User>() 
    .HasOptional<ActivationTicket>(u => u.ActivationTicket) 
    .WithOptionalPrincipal(); 

esto le dará una tabla ActivationTickets con una identificación de usuario que es anulable.

+0

Estoy empezando con EF, así que no estoy muy seguro de dónde poner esta regla de mapeo. ¿Hay un lugar recomendado donde almacenar todas esas asignaciones? – b3n

+2

Tiene dos opciones. 1) Póngalo directamente en un método de su clase que derive de DbContext: anulación protegida void OnModelCreating (ModelBuilder modelBuilder) - O - 2) Defina las asignaciones en clases separadas usando modelBuilder.Configurations.Add (new ...) – anon

+1

Recomiendo definir mapeos en clases separadas (defina YourModelClass_MappingClass que deriva de EntityTypeConfiguration , y defina el mapeo en el ctor de esta clase, luego debe inicializarlo en el evento DbContext OnModelCreating como @anon escribió en su comentario. usar clases separadas porque sería un verdadero desastre definir el mapeo de todas tus clases en el mismo lugar – Prokurors

4

@ B3n Debería ser suficiente para hacer esto, al menos, con el VS 2013:

public class User 
{ 
    public int UserId { get; set; } 

    public string Username { get; set; } 

    public int? ActivationTicketId { get; set;} 

    public virtual ActivationTicket ActivationTicket { get; set; } 
} 

Esta es la parte importante:

public int? ActivationTicketId { get; set;} 

Esto especificará el ForeignKey en su "Usuario "tabla para el ActivasionTicket y defina que es opcional.

créditos vaya a: http://forums.asp.net/t/1948351.aspx?Change+Foreign+Key+to+nullable+using+Code+First#5554732

que tenían el mismo problema y al instante trabajó para mí.

También como nota marqué todas mis claves principales con la anotación de datos "[Key]". Esto podría ser necesario para hacer que esto funcione.

Cuestiones relacionadas