Вставьте сценарий «многие ко многим» в EF 4.0 с классами POCO - PullRequest
0 голосов
/ 24 декабря 2010

У меня есть схема базы данных, подобная следующей:

Пользователь 1 ---- * UserRole * ---- 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. У кого-нибудь есть идеи по этому поводу?

1 Ответ

0 голосов
/ 11 февраля 2011
    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;}
}

Первые решения это выглядит лучше, вы должны добавить DbSet UserRoles к вашему DbContext

Он был протестирован EF CTP5 Poco.

Удачи

...