我是Entity Framework 4的新手。

我的项目包括一个WebApplication&ClassLibrary项目。 我必须使用ADO.Net POCO实体生成器,因为在ClassLibrary项目中,我有多个edmx文件,并且它们之间具有某些通用模型。

在edmx中,我具有用于User,Role和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();
    }
}

我的问题是

  1. 在AddRole方法中,如果我不使用AttachTo(),则将当前用户的重复记录输入到User表中,并将该角色插入到UserRole中。 为什么attachTo()可以防止这种情况发生?
  2. 在RemoveRole方法中,代码可以流畅运行且没有错误,但是表中的记录不会被删除。 为什么?

有谁能够帮助我?

===============>>#1 票数: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);
}

重要的是使用属于单个上下文实例的实体。 否则,您将必须脱离先前的上下文并附加到当前上下文。

  ask by Ravi Shet translate from so

未解决问题?本站智能推荐: