我对Entity Framework 4相对较新。
我的项目包括WebApplication& ClassLibrary项目。我不得不使用ADO.Net POCO实体生成器,因为我在ClassLibrary项目中有多个edmx文件,其中包含某些常见模型。
在edmx中我有User,Role& amp; UserRole(仅包含2个外键列,UserID& RoleID)。实体框架分别创建了两个模型,即用户和角色,分别具有角色和用户的导航属性。我已经从.edmx中删除了defineQuery,这使我能够将记录添加到UserRole表中。
在我的网络表单中,我有这个代码:
要插入角色:
User user = new User(iUserID); //initializes the the user object with the user info
user.AddRole(RoleID); //passes in the roleid that needs to be inserted`
删除用户的角色:
User user = new User(iUserID); //initializes the the user object with the user info
user.RemoveRole(RoleID); //passes in the roleid that needs to be deleted`
部分用户类的内容(构造函数& 2方法):
public User(short UserID)
{
using (SecurityEntities Context = new SecurityEntities())
{
User user = Context.Users.Where(ua => ua.UserID == UserID).Single<User>();
this.UserID = user.UserID;
// etc...
}
}
public void AddRole(short roleID)
{
using (SecurityEntities Context = new SecurityEntities())
{
Role role = Context.Roles.Where(r => r.RoleID == roleID).Single<Role>();
Context.AttachTo("Users", this);
this.Roles.Add(role);
Context.SaveChanges();
}
}
public void RemoveRole(short roleID)
{
using (SecurityEntities Context = new SecurityEntities())
{
Role role = Context.Roles.Where(r => r.RoleID == roleID).Single<Role>();
Context.AttachTo("Users", this);
this.Roles.Remove(role);
Context.SaveChanges();
}
}
我的问题是
有人能帮助我吗?
答案 0 :(得分:1)
在这两种情况下,您都错误地使用了实体框架。用户由(然后跟踪)不同的上下文创建。然后使用不同的上下文实例检索角色。
将创建user
的上下文实例提供给方法
public void AddRole(SecurityEntities Context, short roleID)
{
Role role = Context.Roles.Where(r => r.RoleID == roleID).Single<Role>();
this.Roles.Add(role);
Context.SaveChanges();
}
或将Role
实例提供给方法
public void AddRole(Role role)
{
this.Roles.Add(role);
}
删除方法也遭遇类似问题
public void RemoveRole(short roleID)
{
var role = this.Roles.Where(r => r.RoleID == roleID).Single();
this.Roles.Remove(role);
}
重要的是使用属于单个上下文实例的实体。否则,您必须从先前的上下文中分离并附加到当前上下文。