代码之家  ›  专栏  ›  技术社区  ›  burnside

在实体框架中保存多对多关系对象

  •  1
  • burnside  · 技术社区  · 17 年前

    我正在尝试保存一个实体,该实体在实体框架中构成了多对多关系的一部分,并出现错误:无法更新EntitySet“zrm_op_defaultLoccvgsMapping”,因为它有一个定义查询,并且元素中不存在支持当前操作的元素。

    我的google fu在这方面很弱,但我知道我可能需要编辑设计器代码并连接一个存储过程来手动执行插入操作。

    我的表结构如下:

    位置: 洛西德 废话。

    覆盖范围: CVGID, 废话。

    洛克: 洛西德 无钥匙(无钥匙)

    救命!

    1 回复  |  直到 16 年前
        1
  •  1
  •   jason    16 年前

    我有一个确切的问题,但我想出了一个解决办法。不过,我会警告你,这真是个糟糕的问题。在我的情况下,我有三张桌子:

    视频 -视频ID、int、pk -布拉

    评论 -commentid、int、pk -userid,int(作出注释的用户) -注释文本,字符串

    视频评论 -视频ID、int、pk -commentid、int、pk

    首先,要使实体框架正确设置关系,关联表上的两列(在我的例子中是videocomments)必须是主键。

    也就是说,下面是我添加新评论的方式。

     public VideoDTO AddCommentToVideo(VideoDTO pVideo, CommentDTO pComment)
            {
                Video video = context.Videos.Where(v => v.VideoId == 
            pVideo.VideoId).FirstOrDefault();
                User user = context.Users.Where(u => u.UserId == 
            pComment.User.UserId).FirstOrDefault();
                Comment comment = new Comment();
                comment.CommentText = pComment.CommentText;
                comment.User = user;
                comment.Videos.Add(video);
                context.AddToComments(comment);
                context.SaveChanges();
    
                return pVideo;
            }
    

    这是非常糟糕的……就像穿越河流一样糟糕。我做了2个查询来获取实体框架强制的完整对象,这样我就可以创建一个新的注释。我想找个更好的方法,但我不知道。也许这能有所帮助。