Marco de entidad: establecer una propiedad de clave externa
-
20-08-2019 - |
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?
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.