实体框架 - 多对多关系未保存到数据库

本文关键字:保存 数据库 框架 实体 关系 | 更新日期: 2023-09-27 18:34:49

我今天早上偶然发现了实体框架的问题。

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

    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;
        }
    }

我调用保存方法,将现有组作为参数。组包含一个我要添加为成员的用户。

该方法成功完成,但关系不会保留在数据库中。任何帮助都非常感谢。

编辑:这些是我的课程

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; }
    }
    ...
}

编辑2:这是调用保存方法的地方

    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;
    }

编辑3:我的映射器

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);
        }
    }
}

其余的映射器是相同的,只是使用自己的表。

实体框架 - 多对多关系未保存到数据库

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

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

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