EF不会在db中保存整个复杂对象

时间:2015-07-01 12:51:36

标签: c# entity-framework

我有一个EF代码更新复杂对象(User对象包含Address对象)。但是当我想在User对象更新过程中更新User的Address对象属性时。在用户的更新过程之后,更新的用户属性将保存在db中,但更新后的地址属性在数据库中仍然相同(未保存)。 问题出在哪儿? ?

我的代码在这里:

public class User : BaseEntity
    {

        public string Username { get; set; }
        public string Passwd { get; set; }
        public string Firstname { get; set; }
        public string Middlename { get; set; }
        public string Secondname { get; set; }
        public DateTime BirthDate { get; set; }
        public string Email { get; set; }
        public string Mobilenumber { get; set; }
        public bool IsActivated { get; set; }
        public string ActivationCode { get; set; }
        public StatusEnum? CurrentStatus { get; set; }
        public DateTime? CurrentCreateSession { get; set; }
        public StatusEnum? PreviousStatus { get; set; }
        public DateTime? PreviousCreateSession { get; set; }
        public virtual Address Address { get; set; }
 }


 public class Address : BaseEntity
    {
        //[JsonProperty("street")]
        public string Street { get; set; }

        //[JsonProperty("city")]
        public string City { get; set; }

        //[JsonProperty("zipcode")]
        public string ZipCode { get; set; }

        //[JsonProperty("country")]
        public string Country { get; set; }
}

 public virtual void Edit(TEntity entityToUpdate)
        {
            DbSet.Attach(entityToUpdate);
            Context.Entry(entityToUpdate).State = EntityState.Modified;
        }

 public void SaveChanges()
        {
            Context.SaveChanges();            
        }

2 个答案:

答案 0 :(得分:2)

DbSet.Attach(entityToUpdate);
Context.Entry(entityToUpdate).State = EntityState.Modified;

User.Edit(someUserEntity);

这些行仅表示需要将User实体保存到数据库中。任何一对多关系都不会被保存(在您的情况下为地址实体)。您还需要将子实体的状态更改为Modified以更新子实体。

答案 1 :(得分:0)

第一个问题,为什么要插入Edit方法?你需要一个特定的行为吗?因为EF知道实体是否已被编辑。另外,请注意,因为将实体设置为使用乐观锁定(默认EF行为),您可能会收到并发异常。

还有一点建议,如果用户之间没有共享地址,则将其标记为复杂类型,以避免地址表。

无论如何,假设这个

public class BaseEntity
{
    public int Id { get; set; }
}

public class Model6Context : DbContext
{
    public Model6Context(DbConnection connection)
        : base(connection, false)
    { }

    public DbSet<Address> Addresses { get; set; }
    public DbSet<User> Users { get; set; }

}

并且您没有指定任何映射 这段代码

        Model6Context context = new Model6Context(connection);

        User user = new User
        {
            Firstname = "Bubi",
            Address = new Address
            {
                City = "Modena"
            }
        };

        context.Users.Add(user);
        context.SaveChanges();

        int userId = user.Id;

        context.Dispose();

        context = new Model6Context(connection);

        user = context.Users.First(u => u.Id == userId);
        Console.WriteLine("{0} {1}", user.Firstname, user.Address.City);

        user.Address.City = "Bologna";
        context.SaveChanges();

        context.Dispose();

        context = new Model6Context(connection);

        user = context.Users.First(u => u.Id == userId);
        Console.WriteLine("{0} {1}", user.Firstname, user.Address.City);

生成此输出

布比摩德纳 布比博洛尼亚

有什么区别?