c# - studio - instalar ado net entity data model
Marco de la entidad: establecer una propiedad de clave externa (6)
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 en EF?
Puede crear un método de extensión que construya la entidad en función de estas ID.
El uso de una EntityKey resuelve su problema;)
alk.
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();
Lo que he estado haciendo para facilitar las cosas es agregar la propiedad de la 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);
}
}
otro método, si no te molesta ''polucionar'' tu esquema db es agregar una columna calculada, por ejemplo, si tuvieras un campo de clave foránea FK_Customer podrías definir una nueva columna calculada FK_Customer_Computed que tiene la expresión FK_Customer. Cuando genere / actualice su modelo de edmx, el campo aparecerá como un campo normal al que podrá hacer referencia desde su objeto de entidad.
O espera por EF4 :)
Siguiendo con la respuesta de Dylan, Alex James ha escrito un blog sobre esto precisamente, explicando el problema completo y cómo abordar la solución parcial de clase + propiedad.