6

Estoy tratando de utilizar el enfoque foreign key association para lograr una asociación de uno a uno en EF. En mi caso, existe una asociación entre un Usuario y un Equipo, y necesito una propiedad de navegación en cada uno de ellos. Me encontré con un problema al tratar de guardar datos.Datos de ahorro de Entity Framework en asociaciones uno a uno

Esto es lo que los modelos se parecen:

public class Team 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int OwnerID { get; set; } 
    public virtual User Owner { get; set; } 
} 

public class User 
{ 
    public int ID { get; set; } 
    public string UserName { get; set; } 

    public int TeamID { get; set; } 
    public virtual Team Team { get; set; } 
} 

que añaden estos bits a la DbContextOnModelCreating(), como se indica en el blog mencionado anteriormente:

modelBuilder.Entity<User>() 
    .HasRequired(u => u.Team) 
    .WithMany() 
    .HasForeignKey(u => u.TeamID); 

modelBuilder.Entity<Team>() 
    .HasRequired(t => t.Owner) 
    .WithMany() 
    .HasForeignKey(t => t.OwnerID) 
    .WillCascadeOnDelete(false); 

Y ahora al añadir datos como esto:

User u = new User(); 
u.UserName = "farinha"; 
Team t = new Team("Flour Power"); 
u.Team = t; 
t.Owner = u; 
context.Users.Add(u); 
context.Teams.Add(t); 
context.SaveChanges(); 

o incluso así:

User u = new User(); 
u.UserName = "farinha"; 
u.Team = new Team("Flour Power"); 
context.Users.Add(u); 
context.SaveChanges(); 

Estoy recibiendo el siguiente error:

Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.

Cualquier idea de cómo solucionar esto? ¿Estoy guardando los datos de una manera incorrecta?

Gracias de antemano

Respuesta

8

Usted no está ahorrando manera incorrecta de datos, sino que simplemente no puede trabajar debido a la dependencia que ha definido bidireccional. El equipo se puede guardar solo si se relaciona con el usuario ya guardado y el usuario puede guardarse solo si está relacionado con el equipo existente. Usted debe hacer una relación opcional marcando anulable propiedad de clave externa (por ejemplo TeamId en User):

public class User 
{ 
    public int ID { get; set; } 
    public string UserName { get; set; } 

    public int? TeamID { get; set; } 
    public virtual Team Team { get; set; } 
} 

A continuación, debe guardar la entidad User primero y luego puede guardar Team.

User u = new User(); 
u.UserName = "farinha"; 
context.Users.Add(u); 
context.SaveChanges(); 

u.Team = new Team { Name = "Flour Power", OwnerID = u.ID }; 
context.SaveChanges(); 
+0

@ Ladislav-Mrnka que causa el error de cambiar a 'No se puede insertar el valor NULL en la columna 'ID del equipo', tabla 'DeuceHigh.dbo.User'; la columna no permite nulos. INSERT falla La declaración ha finalizado. – Farinha

+1

@Farinha Dado que su modelo ha cambiado, ¿la tabla de la base de datos también se ha actualizado? – DDiVita

+0

@Farinha: Este es un error de nivel de base de datos, lo que significa que TeamID en la tabla de Usuario aún no puede contener nulos. No recreó ni modificó la base de datos. –

Cuestiones relacionadas