Entity Framework: Definir uma propriedade de chave estrangeira
-
20-08-2019 - |
Pergunta
Nós temos uma tabela que parece mais ou menos assim:
CREATE TABLE Lockers
{
UserID int NOT NULL PRIMARY KEY (foreign key),
LockerStyleID int (foreign key),
NameplateID int (foreign key)
}
Todas as teclas se relacionam com outras mesas, mas por causa da forma como o aplicativo é distribuído, é mais fácil para nós para passar ao longo IDs como parâmetros. Então, nós gostaríamos de fazer isso:
Locker l = new Locker {
UserID = userID,
LockerStyleID = lockerStyleID,
NameplateID = nameplateID
};
entities.AddLocker(l);
Nós poderíamos fazê-lo em LINQ to SQL, mas não EF?
Solução
Esta característica ausente parece incomodar muita gente.
- Boas notícias:. MS vai abordar a questão com .NET 4.0
- Más notícias:., Por agora, ou se você está preso em 3,5 você tem que fazer um pouco de trabalho, mas é possível
Você tem que fazê-lo como este:
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();
Outras dicas
O que eu tenho feito para facilitar as coisas é adicionar a propriedade de chave estrangeira-me na classe 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);
}
}
Você poderia fazer um método de extensão que constrói a entidade com base nestes ID do.
Usando um EntityKey resolve o seu problema;)
alk.
outro método, se você não se importa 'poluindo' você db esquema é adicionar uma coluna calculada, por exemplo, se você tivesse um campo de chave estrangeira FK_Customer você poderia definir uma nova coluna computada FK_Customer_Computed que tem a expressão FK_Customer. Quando você gera \ atualizar seu modelo edmx campo aparecerá como um campo regular que você pode, então, referência de você objeto de entidade.
ou esperar por EF4:)
Na sequência da resposta de Dylan, Alex James escreveu um blog sobre precisamente este, explicando o problema na sua totalidade e como ir sobre a solução parcial classe + propriedade.