【问题标题】:Entity Framework - Many to Many relationship not saving to database实体框架 - 多对多关系不保存到数据库
【发布时间】:2014-12-21 21:50:47
【问题描述】:

今天早上我偶然发现了 Entity Framework 的一个问题。

我有以下代码映射修改后的实体并将其保存到数据库中。

    public Group Save(Group x)
    {
        using (var db = new HostContext())
        {
            db.Projects.Attach(x.Project);

            if (x.ID != 0)
            {
                db.AttachableObjects.Attach(x);
                var manager = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager;
                manager.ChangeObjectState(x, EntityState.Modified);
            }
            else
            {
                db.AttachableObjects.Add(x);
            }

            db.SaveChanges();
            return x;
        }
    }

我以现有组作为参数调用 Save 方法。组包含一个我想添加为成员的用户。

该方法成功完成,但是该关系未保存在数据库中。 非常感谢任何帮助。

编辑:这些是我的课程

class User : AttachableObject
{

    ...

    private List<Group> memberof;

    [DataMember]
    [InverseProperty("Members")]
    public List<Group> MemberOf
    {
        get { return memberof; }
        set { memberof = value; }
    }

    ...
}

class Group : AttachableObject
{

    ...

    private List<User> members;

    [DataMember]
    [InverseProperty("MemberOf")]
    public List<User> Members
    {
        get { return members; }
        set { members = value; }
    }

    ...
}

EDIT2:这是调用 Save 方法的地方

    public Group AcceptInvite(int id)
    {
        var mapper = new InviteMapper();
        var userMapper = new UserMapper();
        var groupMapper = new GroupMapper();

        var invite = mapper.Find(id);

        if (invite != null)
        {
            var group = groupMapper.Find(invite.GroupID);
            var user = userMapper.Find(invite.InviteeID);

            group.Members.Add(user);

            mapper.Delete(invite.ID);
            return groupMapper.Save(group);
        }

        return null;
    }

EDIT3:我的映射器

public class GroupMapper
{
    public Group Find(int id)
    {
        using (var db = new HostContext())
        {
            return db.AttachableObjects
                .Include("Project")
                .OfType<Group>().FirstOrDefault(x => x.ID == id);
        }
    }
}

其余的映射器都是一样的,只是使用自己的表。

【问题讨论】:

    标签: c# entity-framework relationship


    【解决方案1】:

    您没有更改Project 的关系信息,您只是将x 设置为已修改,必须显式更改关系信息。

    所以x.Project 必须有一些属性指向Group,您需要设置它以便记录更改。

    我猜x 是通过一些反序列化过程复活的?

    【讨论】:

    • 对不起,我可能没有清楚地描述我的问题。不是映射的关系是类 User 和 Group 之间的 M:N 关系。我已经用所述类的代码编辑了我的原始帖子。组的成员属性包含我想成为成员的用户(x)。
    • 我明白了.. 您何时将用户对象添加到组中?发生这种情况,然后对象是 ser/deser?
    • 使用 ef 从数据库中获取用户和组对象,然后将用户添加到组中,并将组用作我在问题中发布的 Save 方法中的参数。对象未反序列化。
    • 那么,如果用户一开始就被加载到组中,为什么您希望添加发生?您需要显示将用户添加到组的位置,如果您没有添加,那么我不知道您描述的是什么问题。
    • 我注意到你有[DataMember] 你是通过网络发送还是所有这些都是本地加载的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2015-12-09
    • 1970-01-01
    相关资源
    最近更新 更多