EF 4.1 SaveChanges不更新导航或引用属性

Ste*_*ory 17 entity-framework entity-framework-4.1

我首先使用代码,可以毫无问题地添加记录.正确创建数据库并且没有任何问题地播种.但是在我的编辑操作中调用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; }
}
Run Code Online (Sandbox Code Playgroud)

我不会包含代码,但我确实有一些自定义模型绑定.我的编辑操作(使用MVC 3)没有填充ContactType或USState属性.绑定正确地返回一个完全填充的Contact对象,其中包含表单中的正确值.

如果我正确理解EF 4.1,我只需要执行以下操作以在保存Contact对象时保持对数据库的更改:

if(ModelState.IsValid)
{
    context.Entry(contact).State = EntryState.Modified;
    context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,只更新原始属性.我在上面的例子中遗漏了一些东西:我正在使用一个事务,一个try catch块,并检查它是否是一个新记录.

我使用过SQL Profiler,可以确认ContactType和Territory表的更新查询没有发送到数据库服务器.

我的导航和引用属性的State属性是Modified,但我也尝试手动设置:

    context.Entry(contact).Collections("ContactTypes").EntityEntry.State = EntityState.Modified;
    context.Entry(contact).Reference("USState").EntityEntry.State = EntityState.Modified;
Run Code Online (Sandbox Code Playgroud)

我可能会弄错,但我很确定我的代码是在CTP5下运行的.

有任何想法吗?在这一点上,我不确定如何进行调试.

谢谢,史蒂夫

小智 0

假设您的 DAL 对象/集合来自实体框架,请执行此操作;

Contact.ContactTypes.Load();

这将从底层源刷新相关的 coltactTypes 列表。

希望这可以帮助。