我有一个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();
}
答案 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);
生成此输出
布比摩德纳 布比博洛尼亚
有什么区别?