2009-08-12 17 views
3

.NET 3.5 SP1を使用しています。 テーブル 'app_User_table'に基づいて、 'category_table'と 'MyUser'テーブルに基づいてエンティティ 'カテゴリ'を作成しました。Entity Framework v1の外部キーの追加と更新

CREATE TABLE category_table (
catg_id int, 
catg_name varchar(50), 
catg_description varchar(250) 
) 

CREATE TABLE App_User_table (
userid int, 
username varchar(50), 
fullname varchar(50), catg_id int, 
fullAddress varchar(200), 
comments varchar(1000),CONSTRAINT FK_1 FOREIGN KEY (catg_id) REFERENCES Category_table (catg_id) 
) 

public class Category: System.Data.Objects.DataClasses.EntityObject{  
public int CategoryId{get; set;} 
public string CategoryName {get; set;} 
    .... 
} 

public class AppUser : System.Data.Objects.DataClasses.EntityObject{ 
public int Uid {get; set;} 
public string UserName {get; set;} 
public string Name {get; set;} 
public string Address {get; set;} 
public string Comment {get; set;} 
public Category category_table { .. } 
public System.Data.Objects.DataClasses.EntityReference<Category> category_tableReference {...} 
........... 
} 

私は、ASP.NET MVCアプリケーションでAPPUSERエンティティを追加して更新します。更新のための

//create entity with passed values 
AppUser user = new AppUser(){Uid=id, .... } 
//Set EntityReference 
user.category_tableReference.EntityKey = new System.Data.EntityKey("MyContext.CategorySet", "CategoryId", categoryIdSelected); 
myContext.AddToCategorySet(user); 
myContext.SaveChanges(true); 

//create entity with passed Id 
AppUser user = new AppUser(){Uid=id } 
//Attach entitymyContext.AttachTo("UserSet", user); 
//Update entity with passed values 
user.Address = addr; 
.... 
のDropDownListから区分を選択

//更新

user.category_tableReference.EntityKey = new System.Data.EntityKey("MyContext.CategorySet", "CategoryId", categoryId); 

UpdateメソッドがDATABに区分を更新しないの追加については

ase。

問題を解決する最善の方法は何ですか。

ありがとうございます。

答えて

8

ここでは、私はMVCアプリにアップデートするために使用するアプローチです:

// Put the original Stub Entities for both the original User and its 
// original category. The second part is vital, because EF needs to know 
// original FK values to successfully do updates in 3.5 SP1 
AppUser user = new AppUser { 
    Uid = id, 
    Category = new Category { 
     CategoryId = OriginalCategoryID 
    } 
}; 
ctx.AttachTo("UserSet", user); 

// Then do this: 
if (user.Category.CategoryId != categoryIdSelected) 
{ 
    Category newCategory = new Category {CategoryId = CategoryIdSelected}; 
    // Attach because I assume the category already exists in the database 
    ctx.AttachTo("CategorySet", newCategory); 
    user.Category = newCategory; 
} 

// Update entity with passed values 
user.Address = addr; 
.... 

あなたはどこからOriginalCategoryIDを取得できるようにする必要が見ることができるように、私はお勧めフォーム上の非表示フィールド。

これは、必要なすべてを行います。スタブエンティティのトリックの詳細については、Tip 26 - How to avoid database queries using Stub Entitiesを参照してください。

希望これは単に真実ではないこと

アレックス

1

更新:Craig StuntzとAlex Jamesのコメントを参照してください。私は修正しました。あなたが求めたものを達成するために単に "EntityKey"を更新することは可能です。ここでの私のポストはもうバージョン1では

、Entity Frameworkのは、単に外部キー値が挿入された状態で作業することはできません適用されません - あなたは「APPUSER」に「カテゴリー」オブジェクトのインスタンスを追加する必要がありますさんCateogryナビゲーションプロパティ:

//create entity with passed values 
AppUser user = new AppUser(){Uid=id, .... } 

// set the Category navigation property 
Category newUserCategory = Category.GetbyID(4); // or whatever you need 
user.Category = newUserCategory; 

myContext.AddToCategorySet(user); 
myContext.SaveChanges(true); 

今年後半に.NET 4.0いくつかの時間で出荷されますEFのV4(2009)では、あなたは、2つのエンティティ間の関連付けを作成するだけで外部キーの値を設定することができるようになります起こる。

は、ここでその詳細を参照してください:

をしかし、今のところ、あなたは完全なオブジェクトを設定する必要がある - ちょうど言及はしないだろう。

マルク・

+0

に役立ちます。アレックスの「スタブオブジェクト」の提案以外にも、IDだけでEntityKeyを新規に作成し、それを参照に割り当てることができます。 –

+0

まあ、Alexの提案は基本的に私のものと同じです - あなたは "フル" Categoryオブジェクトを作成する必要があります - 単に "4"という値を外部キー列に割り当てることはできません - あなたは "Category"オブジェクト。 –

+0

EntityKeyの割り当て方法をすべて表示できますか? –

関連する問題