我使用EF 4.1代码优先。我有一个属性是这样定义的实体:实体框架代码第一次更新不会更新外键
public class Publication
{
// other stuff
public virtual MailoutTemplate Template { get; set; }
}
我用流利的风格像这样配置本外键:我有一些代码的MVC表单处理程序在它
modelBuilder.Entity<Publication>()
.HasOptional(p => p.Template)
.WithMany()
.Map(p => p.MapKey("MailoutTemplateID"));
那看起来像这样:
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();
}
在这种情况下,我们正在更新现有的出版物实体,所以我们正在经历其他路径。当_unitOfWork.Commit()触发时,UPDATE发送到SQL Profiler和Intellitrace中可以看到的数据库,但它不包含更新中的MailoutTemplateID。
让它实际更新模板有什么窍门?
库代码:
public virtual void Update(TEntity entity)
{
_dataContext.Entry(entity).State = EntityState.Modified;
}
public virtual TEntity Get(int id)
{
return _dbSet.Find(id);
}
的UnitOfWork代码:
public void Commit()
{
_dbContext.SaveChanges();
}
如果很重要,MailoutTemplateID不会在开始时设置。 – ssmith
尝试将'publication.Template = ...'这一行移动到'... Commit'之前的方法底部。变更检测可以确认,然后希望更改模板并将ID发送到数据库。将状态设置为'Modified'对'MailoutTemplateID'列没有影响,因为它不是模型中的标量属性。 – Slauma