【发布时间】:2012-09-16 09:58:59
【问题描述】:
我正在使用 EF Code First 和以下配置
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<UserProfile>()
.HasMany(x => x.TeamLeaders)
.WithMany()
.Map(m => m.MapLeftKey("UserId")
.MapRightKey("TeamLeaderId")
.ToTable("UserTeamLeaders"));
}
TeamLeaders 是用户的 ICollection,即它是自引用多对多关系。
简单来说,一个用户可以拥有多个团队负责人。这个配置似乎是正确的,因为它创建了我所期望的决斗 FK/PK 链接表。
我有一个 MVC4 应用程序,它允许从集合中编辑、添加和删除团队负责人。
在我的控制器中,我最初有以下内容:
var original = context.UserProfiles
.Include("TeamLeaders")
.Single(x => x.UserId == model.UserId);
context.Entry(original).CurrentValues.SetValues(model);
但是,最后一行未能将 TeamLeaders 集合标记为已更新,当我调用 SaveChanges() 时,没有记录任何更改。
相反,我在我的 User 类上编写了一个简单的 CopyProperties 方法,它使用反射来手动复制属性,所以在我的控制器中我现在有:
var original = context.UserProfiles
.Include("TeamLeaders")
.Single(x => x.UserId == model.UserId);
//context.Entry(original).CurrentValues.SetValues(model);
original.CopyProperties(model);
但是,这太过分了,SaveChanges 尝试将新用户添加到与所选团队负责人的个人资料相匹配的系统中。
谁能建议我做错了哪一部分?我不确定是否需要更新映射,或者更改将属性从视图模型复制到模型的方式
【问题讨论】:
标签: asp.net-mvc entity-framework many-to-many code-first