更新拆分表而不检索数据

时间:2011-12-12 10:54:13

标签: c# entity-framework-4.1 code-first

我有一张桌子,我分成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);
     }
}

1 个答案:

答案 0 :(得分:0)

问题在于你的UserDAO(并且总体上期望这种通用方法可行)。您正在保存用户实体并设置其状态,但您并未告知EF该地址已被修改。您必须为对象图中的每个实体设置正确的状态,这使得通用方法非常困难。

如果您致电AddObject,EF会浏览实体图并将所有未知实体标记为自动添加(您不需要为其设置状态)但是当您致电Attach EF时将浏览实体图并将所有未知实体标记为未更改。因为您仅为用户更改了状态,所以地址未更新到数据库。