Обновление таблицы разделения без извлечения данных - PullRequest
1 голос
/ 12 декабря 2011

У меня есть таблица, и я разделился на 2 объекта:

public class User
{
  [key]
  public byte ID{get;set;}
  ... 
  ...
  public virtual UserAddress{get;set;}
}

class 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 голосов
/ 13 декабря 2011

Проблема в вашем UserDAO (и в целом ожидание того, что этот общий подход будет работать). Вы сохраняете пользовательскую сущность и устанавливаете ее состояние, но не сказали EF, что адрес также был изменен. Вы должны установить правильное состояние для каждой сущности в графе объектов, что делает общий подход довольно сложным.

Если вы позвоните AddObject EF пройдет через граф сущностей и пометит все неизвестные сущности как добавленные автоматически (вам не нужно устанавливать для них состояние), но при вызове Attach EF пройдет через граф сущностей и пометить все неизвестные объекты как неизмененные. Поскольку вы изменили состояние только для пользователя, адрес не обновляется в базе данных.

...