我有一张桌子,我分成2个实体:
public class User
{
[key]
public byte ID{get;set;}
...
...
public virtual UserAddress{get;set;}
}
类UserAddress:
public class UserAddress
{
[key]
public byte ID{get;set;}
public string Address{get;set;}
...
}
当我尝试插入时,它完美无缺。但我想在不加载用户数据的情况下更新UserAddress:
GenericDAO.cs
public abstract class GenericDAO<TEntity>: IGenericRepository<TEntity> where TEntity : class
{
private ObjectContext _context;
private IObjectSet<TEntity> _objectSet;
public GenericDAO()
: this(((IObjectContextAdapter)new MyContext()).ObjectContext)
{
}
public GenericDAO(ObjectContext context)
{
_context = context;
_objectSet = _context.CreateObjectSet<TEntity>();
}
public void Save(TEntity entity, System.Data.EntityState state)
{
if(state == System.Data.EntityState.Added)
_objectContext.AddObject(entity);
else
_objectContext.Attach(entity);
_context.ObjectStateManager.GetObjectStateEntry(entity).ChangeState(state);
_context.SaveChanges();
}
正如我所说,当我添加对象时,工作。但是当我尝试更新对象时,我没有收到任何错误,但我的UserAddress没有更新。
任何人都可以帮助我?
提前谢谢
编辑:GenericDAO.cs已更新。
My MyContext.cs
public MyContext : DbContext
{
public DbSet<User> User{get;set;}
public DbSet<UserAddress> UserAddress {get;set}
protected override OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new UserConfiguration());
modelBuilder.Configurations.Add(new UserAddressConfiguration());
}
}
UserConfiguration.cs
public class UserConfiguration: EntityTypeConfiguration<User>
{
public UserConfiguration()
: base()
{
HasKey(p => p.ID);
Property(p => p.ID).HasColumnName("UserID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
HasRequired(p => p.UserAddress).WithRequiredPrincipal();
ToTable("User");
}
}
UserAddressConfiguration.cs
public class UserAddressConfiguration : EntityTypeConfiguration<UserAddress>
{
public UserAddressConfiguration ()
: base()
{
HasKey(p => p.ID);
ToTable("User");
}
}
ConcreteDAO.cs
public class ConcreteDAO<T> : GenericDAO<T> where T: class
{
}
在我的UserDAO.cs里面
public class UserDAO
{
public static void Save(User user)
{
System.Data.EntityState state = System.Data.EntityState.Added;
if (user.ID > 0)
state = System.Data.EntityState.Modified;
new ConcreteDAO<User>().Save(user, state);
}
}
答案 0 :(得分:0)
问题在于你的UserDAO(并且总体上期望这种通用方法可行)。您正在保存用户实体并设置其状态,但您并未告知EF该地址已被修改。您必须为对象图中的每个实体设置正确的状态,这使得通用方法非常困难。
如果您致电AddObject
,EF会浏览实体图并将所有未知实体标记为自动添加(您不需要为其设置状态)但是当您致电Attach
EF时将浏览实体图并将所有未知实体标记为未更改。因为您仅为用户更改了状态,所以地址未更新到数据库。