2009-08-12 4 views
3

Я использую .NET 3.5 SP1. Я создал объект «Категория», основанный на таблице «category_table» и «MyUser», на основе таблицы «App_User_table».Добавление и обновление внешнего ключа в 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 {...} 
........... 
} 

Я хочу добавить и обновить AppUser объект в приложении ASP.NET MVC.

Дополните:

//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; 
.... 

// обновление выбранного CategoryId из DropDownList

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

метод Update не обновляет CategoryId в datab аза.

Пожалуйста, расскажите, что является лучшим способом решить проблему?

спасибо.

ответ

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 для получения дополнительной информации о трюке Stub Entity.

Надеется, что это помогает

Алекс

1

ОБНОВЛЕНИЕ: см. Комментарии Крейга Стенца и Алексея Джеймса - я исправлен - возможно, просто обновить «EntityKey», чтобы добиться того, что вы просили. Мой пост здесь не применяется больше

В версии 1, Entity Framework не может работать только с значения внешнего ключа вставляется - вам нужно добавить «Категория» экземпляр объекта к «AppUser» «s 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); 

с EF v4, который будет поставляться с .NET 4.0 через некоторое время в этом году (2009), вы затем сможете установить только значение внешнего ключа, чтобы сделать ассоциации между двумя объектами бывает.

Смотреть подробнее об этом здесь:

Но сейчас, вам необходимо установить полный объект - только ссылки не будет делать.

Марк

+0

Это просто не соответствует действительности. Помимо предложения «заглушки» Алекса, вы также можете создать EntityKey только с идентификатором и назначить его ссылке. –

+0

Ну, предложение Алекс в основном такое же, как мое - вам просто нужно создать «полный» объект категории - вы не можете просто присвоить значение «4» столбцу внешнего ключа - вам нужно предоставить объект «Категория» , –

+0

Можете ли вы показать нам, как назначить этот EntityKey? –