我正在使用.NET 3.5 SP1。 我根据表'app_User_table'创建了基于表'category_table'和'MyUser'的实体'Category'。
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
更新选定的CategoryIduser.category_tableReference.EntityKey = new System.Data.EntityKey("MyContext.CategorySet", "CategoryId", categoryId);
Update方法不会更新数据库中的CategoryId。
请告诉我,解决问题的最佳方法是什么?
谢谢。
答案 0 :(得分: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 :(得分:1)
更新:请参阅Craig Stuntz和Alex James的评论 - 我已经纠正了 - 似乎可以简单地更新“EntityKey”以实现您的要求。我的帖子不再适用
<击> 在版本1中,实体框架无法仅使用插入的外键值 - 您需要将“类别”对象实例添加到“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);
使用将在今年晚些时候(2009年)发布的.NET 4.0的EF v4,您将能够设置外键值以使两个实体之间的关联发生。
点击此处查看更多信息:
但是现在,你需要设置完整的对象 - 只是引用不会。
击>
马克