【发布时间】:2011-10-12 01:06:19
【问题描述】:
我使用的是 EF 4.1 Code First。我有一个用这样的属性定义的实体:
public class Publication
{
// other stuff
public virtual MailoutTemplate Template { get; set; }
}
我已经使用流畅的样式配置了这个外键,如下所示:
modelBuilder.Entity<Publication>()
.HasOptional(p => p.Template)
.WithMany()
.Map(p => p.MapKey("MailoutTemplateID"));
我有一个 MVC 表单处理程序,其中包含一些代码,如下所示:
public void Handle(PublicationEditViewModel publicationEditViewModel)
{
Publication publication = Mapper.Map<PublicationEditViewModel, Publication>(publicationEditViewModel);
publication.Template = _mailoutTemplateRepository.Get(publicationEditViewModel.Template.Id);
if (publication.Id == 0)
{
_publicationRepository.Add(publication);
}
else
{
_publicationRepository.Update(publication);
}
_unitOfWork.Commit();
}
在这种情况下,我们正在更新现有的 Publication 实体,因此我们将通过 else 路径。当 _unitOfWork.Commit() 触发时,会向我在 SQL Profiler 和 Intellitrace 中看到的数据库发送一个 UPDATE,但它不包括更新中的 MailoutTemplateID。
让它真正更新模板的诀窍是什么?
存储库代码:
public virtual void Update(TEntity entity)
{
_dataContext.Entry(entity).State = EntityState.Modified;
}
public virtual TEntity Get(int id)
{
return _dbSet.Find(id);
}
工作单元代码:
public void Commit()
{
_dbContext.SaveChanges();
}
【问题讨论】:
-
如果重要的话,MailoutTemplateID 不会在此开始时设置。
-
尝试将行
publication.Template = ...移动到方法底部...Commit之前。更改检测随后有望识别模板已更改,并且必须将 ID 发送到数据库。将状态设置为Modified对MailoutTemplateID列没有影响,因为它不是模型中的标量属性。
标签: entity-framework-4.1 ef-code-first