Pregunta

Tenemos una tabla que se ve más o menos así:

CREATE TABLE Lockers 
{
  UserID int NOT NULL PRIMARY KEY (foreign key),
  LockerStyleID int (foreign key),
  NameplateID int (foreign key)
}

Todas las claves se relacionan con otras tablas, pero debido a la forma en que se distribuye la aplicación, es más fácil para nosotros pasar las ID como parámetros. Entonces nos gustaría hacer esto:

Locker l = new Locker { 
  UserID = userID, 
  LockerStyleID = lockerStyleID, 
  NameplateID = nameplateID 
};
entities.AddLocker(l);

Podríamos hacerlo en LINQ-to-SQL, pero no EF?

¿Fue útil?

Solución

Esta característica que falta parece molestar a mucha gente.

  • Buenas noticias: MS abordará el problema con .NET 4.0.
  • Malas noticias: por ahora, o si estás atascado en 3.5 tienes que hacer un poco de trabajo, pero ES posible.

Tienes que hacerlo así:

Locker locker = new Locker();
locker.UserReference.EntityKey = new System.Data.EntityKey("entities.User", "ID", userID);
locker.LockerStyleReference.EntityKey = new EntityKey("entities.LockerStyle", "ID", lockerStyleID);
locker.NameplateReference.EntityKey = new EntityKey("entities.Nameplate", "ID", nameplateID);
entities.AddLocker(locker);
entities.SaveChanges();

Otros consejos

Lo que he estado haciendo para facilitar las cosas es agregar la propiedad de clave externa yo mismo en la clase parcial:

public int UserID
{
   get
   {
      if (this.User != null)
         return this.User.UserID;
   }
   set 
   {
      this.UserReference.EntityKey = new System.Data.EntityKey("entities.User", "ID", value);
   }
}

Podría crear un método de extensión que construya la entidad en función de estos ID.

Usar una EntityKey resuelve su problema;)

alk.

otro método si no te importa 'contaminar' tu esquema de db es agregar una columna calculada, p. si tuviera un campo de clave externa FK_Customer, podría definir una nueva columna calculada FK_Customer_Computed que tenga la expresión FK_Customer. Cuando genere \ actualice su modelo edmx, el campo aparecerá como un campo normal al que puede hacer referencia desde su objeto de entidad.

O espera a EF4 :)

Siguiendo la respuesta de Dylan, Alex James ha escrito un blog sobre esto precisamente, explicando el problema en su totalidad y cómo abordar la solución parcial de clase + propiedad.

Falsificación de claves foráneas - EF3.5

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top