2009-05-05 8 views
1

Предположим, у меня есть эти таблицы:Как обновить значение внешнего ключа объекта с помощью LINQ to Entities?

Fruits 
- FruitID  INT PK 
- FruitName  NVARCHAR(30) 
- FruitStatusID INT FK: Statuses 

Statuses 
- StatusID  INT PK 
- StatusName NVARCHAR(30) 

Как обновить и название фрукта и его статус в базе данных в таких ситуациях ?:

  1. Update фрукта, который пришел от предыдущего L2E вызова
  2. дано целое число, соответствующее FruitID (то есть, у меня нет полного объекта с фруктами в руке, чтобы начать с)

В.Б. или C# отлично, спасибо!

ответ

2

This works, но не то, что я надеялся:

int StatusID = 4; // Some ID 
Fruit.FruidIDReference.EntityKey = 
    New EntityKey("MyEntities.Statuses", "StatusID", StatusID) 

Конечно, есть более чистый способ сделать это, что не требует жесткого кодирования строк (который вводит исключения во время выполнения, если я делаю опечатка).

+1

я как раз и понял: вы можете построить первые два параметра из существующего значения EntityKey, так что вы не должны жестко закодировать них: New EntityKey (Fruit.FruitIDReference.EntityKey.EntityContainerName + "." + Fruit.FruitIDReference.EntityKey.EntitySetName, Fruit.FruitIDReference.EntityKey.EntityKeyValues ​​[0] .Key, 0) –

+0

Я дам эту попытку, спасибо за следующее: –

0

Если объект Fruit передается другому методу, вы можете:

  1. Передайте ссылку на объект контекста вместе с фруктами и вызвать SaveChanges()

  2. Внесите изменения в объект Fruit в методе нижнего уровня и вызвать SaveChanges() в методе вызова (вы можете проверить, чтобы увидеть, если он был изменен, если вы хотите, чтобы избежать ненужных DB вызовов.)

Код:

//Change the name 
FruitEntities fe = new FruitEntities(); 
Fruit f = fe.Friuts.First(); 
f.FruitName = "NewName"; 
fe.SaveChanges(); 

//Get a fruit by ID and change the status 
//Statuses will need to be included as an Entity in your model with an association to Fruits 
int Id = 2; 
int newStatusID = 0; 
FruitEntities fe = new FruitEntities(); 
Fruit f = (from x in fe.Fruits 
      where x.FruitID == Id 
      select x).First(); 
Status s = (from y in fe.Statuses 
      where y.StatusID = newStatusID 
      select y).First(); 
f.Status = s; 
fe.SaveChanges(); 
+0

Это приятно, потому что ничего жестко в строках, но для загрузки статуса требуется двойная поездка в базу данных. Есть ли способ обойти это? –

+0

Поскольку Статусы представляют собой перечисление, которое не изменяется часто (если вообще когда-либо), вы можете сохранить копию коллекции статусов в памяти (состояние приложения для Интернета) и захватить их по мере необходимости. –

+0

Еще один совет: это много кода, вы можете подумать о написании метода расширения или что-то в качестве помощника, чтобы ваш код был аккуратным. –