Структура сущности:Установка свойства внешнего ключа
-
20-08-2019 - |
Вопрос
У нас есть таблица, которая выглядит примерно так:
CREATE TABLE Lockers
{
UserID int NOT NULL PRIMARY KEY (foreign key),
LockerStyleID int (foreign key),
NameplateID int (foreign key)
}
Все ключи относятся к другим таблицам, но из-за способа распространения приложения нам проще передавать идентификаторы в качестве параметров.Итак, мы хотели бы сделать это:
Locker l = new Locker {
UserID = userID,
LockerStyleID = lockerStyleID,
NameplateID = nameplateID
};
entities.AddLocker(l);
Мы могли бы сделать это в LINQ-to-SQL, но не в EF?
Решение
Эта недостающая функция, кажется, раздражает многих людей.
- Хорошие новости:MS решит эту проблему с помощью .NET 4.0.
- Плохие новости:на данный момент, или если вы застряли на версии 3.5, вам придется немного поработать, но это возможно.
Вы должны сделать это следующим образом:
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();
Другие советы
Чтобы упростить задачу, я сам добавил свойство внешнего ключа в разделяемый класс:
public int UserID
{
get
{
if (this.User != null)
return this.User.UserID;
}
set
{
this.UserReference.EntityKey = new System.Data.EntityKey("entities.User", "ID", value);
}
}
Вы можете создать метод расширения, который создает объект на основе этих идентификаторов.
Использование EntityKey решает вашу проблему;)
алк.
другой метод, если вы не возражаете против «загрязнения» схемы базы данных, — это добавить вычисляемый столбец, например.если у вас есть поле внешнего ключа FK_Customer, вы можете определить новый вычисляемый столбец FK_Customer_Computed, который имеет выражение FK_Customer.Когда вы создаете\обновляете свою модель edmx, поле будет выглядеть как обычное поле, на которое вы затем сможете ссылаться из объекта сущности.
Или дождитесь EF4 :)
Следуя ответу Дилана, Алекс Джеймс написал именно об этом в блоге, полностью объяснив проблему и как подойти к решению частичного класса + свойства.