我首先使用代码,可以毫无问题地添加记录。正确创建数据库并且没有任何问题地播种。但是在我的编辑操作中调用SaveChanges()只会更新实体,而不会更新任何导航或引用属性。
我的模型的简化版本:
public class Contact : IMyBaseObject
{
public Contact()
{
this.Delete = false;
this.ContactTypes = new HashSet<ContactType>();
}
public int Id {get; set;}
public string Name {get;set;}
public bool Delete {get;set;}
public virtual ICollection<ContactType> ContactTypes { get; set; }
public virtual USState USState { get; set; }
}
public class ContactType : MyBaseObject
{
public ContactType()
{
}
public int Id {get; set;}
public string Name {get;set;}
public virtual ICollection<Contact> Contacts {get;set;}
}
public abstract class Territory : MyBaseObject
{
public int Id {get; set;}
public string Name {get;set;}
public string Code {get;set;}
}
public class USState : Territory
{
public USState()
{
}
// Navigation properties
public virtual ICollection<Contact> Contacts { get; set; }
}
我不会包含代码,但我确实有一些自定义模型绑定。我的编辑操作(使用MVC 3)没有填充ContactType或USState属性。绑定正确地返回一个完全填充的Contact对象,其中包含表单中的正确值。
如果我正确理解EF 4.1,我只需要执行以下操作以在保存Contact对象时保留对数据库的更改:
if(ModelState.IsValid)
{
context.Entry(contact).State = EntryState.Modified;
context.SaveChanges();
}
但是,当我这样做时,只会更新原始属性。我在上面的示例中遗漏了一些内容:我正在使用事务,try catch块,并检查它是否是新记录。
我使用过SQL Profiler,可以确认ContactType和Territory表的更新查询是不发送到数据库服务器。
我的导航和参考属性的状态属性已修改,但我也尝试手动设置:
context.Entry(contact).Collections("ContactTypes").EntityEntry.State = EntityState.Modified;
context.Entry(contact).Reference("USState").EntityEntry.State = EntityState.Modified;
我可能会弄错,但我很确定我的代码是在CTP5下工作的。
有什么想法吗?在这一点上,我不确定如何进行调试。
谢谢,史蒂夫
答案 0 :(得分:1)
试试这个:
context.Entry(contact.USState ).State = EntityState.Modified; //////
答案 1 :(得分:0)
假设您的DAL对象/集合来自实体框架,请执行此操作;
Contact.ContactTypes.Load();
这将从基础源刷新相关的coltactTypes列表。
希望这有帮助。
答案 2 :(得分:0)
提供的代码可能还不够。最好看看代码如何在代码中添加导航属性。 因为即使父类被标记为已修改,也不意味着相关的导航属性也被标记为已添加或已修改。 最快的方法是在调用.SaveChanges的地方打开调试器,然后查看上下文变量,查看“Local”属性,然后查看导航属性是否存在,是否添加或修改了modalstate,然后告诉我们需要做什么会容易得多。
答案 3 :(得分:0)
我相信更多代码可以帮助更好地解决问题,特别是模型绑定的代码。但我认为您已经熟悉的一件事是您需要访问这些导航属性(不知何故),以便EF能够自动加载它们。因为您将导航属性标记为虚拟,您允许EF创建代理并覆盖你的nav-properties允许延迟加载。