【问题标题】:Insert Many to Many Scenario in EF 4.0 with POCO Classes在带有 POCO 类的 EF 4.0 中插入多对多场景
【发布时间】:2019-02-01 10:07:00
【问题描述】:

我有一个如下的数据库架构:

用户 1 ---- * 用户角色 *----1 角色

我有一个 POCO 用户和角色类如下:

public class User
{
    public virtual Int64 Id { get; set; }
    public string FullName { get; set; }

    public virtual List<Role> Roles { get; set; }
}

public class Role
{

    public virtual Int64 Id { get; set; }
    public string Name { get; set; }
    public virtual List<User> Users { get; set; }
}

我有一个业务组件类和一个数据访问类来处理业务逻辑和数据访问。

我想为选定的用户添加角色,代码如下:

在业务组件中:

    public void AssignRoles(User user, string[] roleIds)
    {
        user.Roles.Clear();
        foreach (string roleId in roleIds)
        {
            Role role = new RolesDataAccess().SelectRoleById(int.Parse(roleId));
            if (role != null)
            {
                user.Roles.Add(role);
            }
        }
        this.SaveUser(user);
    }

    public User SaveUser(User user)
    {   
        if (user.Id == 0)
        {
            return dataAccess.Create(user);
        }
        else
        {
            return dataAccess.Update(user);
        }
    }

在数据访问中:

    public User Update(User user)
    {
        EntityKey key = null;
        object original = null;

        using (DocsFlowContext ctx = new DocsFlowContext())
        {
            key = ctx.CreateEntityKey(User.EntitySetName, user);
            if (ctx.TryGetObjectByKey(key, out original))
            {
                ctx.ApplyCurrentValues(key.EntitySetName, user);
            }
            ctx.SaveChanges();
        }

        return user;
    }

此代码运行时没有任何错误,但它不会向我的 UserRole 表中插入任何数据。有人对此有任何想法吗?

【问题讨论】:

  • 只有在数据库中存在角色时才添加角色。您能否检查角色确实存在并添加到user.Roles 列表中(只需在调用SaveChanges 之前查看user 对象)。
  • 我正在调试这个,我在更新方法中发现了这一点。 ctx.ApplyCurrentValues(key.EntitySetName, user);此代码行应用对主要属性所做的所有更改,但角色列表除外。 User.Roles 列表未更新。这就是它不向数据库插入任何记录的原因。关于这个问题有什么想法吗??

标签: .net entity-framework-4 poco


【解决方案1】:
    public class UserRole
    { 
    public virtual User User {get; set;}
    public virtual Role Role {get;set;} 
    }
public class User
{
...
public virtual List<UserRole> UserRoles { get; set;}
}

public class Role
{
...
public virtual List<UserRole> RoleUsers { get; set;}
}

public class User
{
...
public virtual List<Role> Roles { get; set;}
public virtual Role Role { get; set;}
}

public class Role
{
public virtual List<User> Users { get; set;}
public virtual User User { get; set;}
}

第一个解决方案看起来更好,您应该添加 数据库集用户角色 到你的 DbContext

已经测试过EF CTP5 Poco。

祝你好运

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多