Entity Framework: установка свойства внешнего ключа

у нас есть таблица, которая выглядит примерно так:

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?

6 ответов


эта отсутствующая функция, кажется, раздражает многих людей.

  • хорошие новости: 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 решает вашу проблему;)

alk.


другой метод, если вы не против "загрязнять" схему БД, - это добавить вычисляемый столбец, например, если у вас есть поле внешнего ключа FK_Customer, вы можете определить новый вычисляемый столбец FK_Customer_Computed, который имеет выражение FK_Customer. При создании\обновлении модели edmx поле будет выглядеть как обычное поле,на которое можно ссылаться из объекта сущности.

или дождитесь EF4:)


следуя из ответа Дилана, Алекс Джеймс написал блог именно об этом, объяснив проблему в полном объеме и как идти о частичном решении class + property.

подделка внешних ключей-EF3.5