EntityFramework 4.0 POCO Proxy Проблема - PullRequest
       35

EntityFramework 4.0 POCO Proxy Проблема

4 голосов
/ 16 августа 2010

Я вижу много людей, задающих подобный вопрос, но не этот точный.Я пытаюсь сделать то, что, как я надеюсь, будет относительно простым с прокси POCO.

using (var context = new MyObjectContext())
{
    context.ContextOptions.ProxyCreationEnabled = true;

    // this does indeed create an instance of a proxy for me...
    // something like Product_SomeBunchOfNumbersForProxy
    var newEntity = context.CreateObject<MyEntity>();

    // throws exception because newEntity is not in ObjectStateManager...why??
    context.ObjectStateManager.GetObjectStateEntry(newEntity);

    // ok, well I guess let's add it to the context manually...
    context.AddObject("Model.Products", newEntity);

    // doesn't throw an exception...I guess that's good
    var state = context.ObjectStateManager.GetObjectStateEntry(newEntity); 

    // prints System.Data.EntityState.Unchanged...oh...well that's not good
    Console.WriteLine(state.State);

    // let's try this...
    context.DetectChanges();

    // doesn't throw an exception...I guess that's good
    state = context.ObjectStateManager.GetObjectStateEntry(newEntity);

    // prints System.Data.EntityState.Unchanged...still no good...
    Console.WriteLine(state.State);

    // dunno, worth a shot...
    context.Refresh(RefreshMode.ClientWins);

    // throws exception because newEntity is not in ObjectStateManager...
    // that didn't help...
    state = context.ObjectStateManager.GetObjectStateEntry(newEntity);
}

Что я делаю не так?Спасибо!

Ответы [ 2 ]

1 голос
/ 23 сентября 2010

Я мало что сделал с прокси, но похоже, что вы ожидаете, что он будет отслеживать изменения в объекте, у которого еще нет постоянного состояния.

CreateEntity действительно просто создает объект.Это ничем не отличается от того, чтобы сказать «новый MyEntity».Таким образом, вы должны добавить эту сущность в контекст и сохранить изменения, прежде чем она будет иметь какое-либо истинное «состояние» для отслеживания:

using (var context = new MyObjectContext())
{
    context.ContextOptions.ProxyCreationEnabled = true;
    var newEntity = context.CreateObject<MyEntity>();
    context.Add(newEntity);
    context.SaveChanges();
    // now GetObjectStateEntry(newEntity) should work just fine.
    // ...
}
1 голос
/ 23 сентября 2010

Похоже, что вы хотите добавить новый прокси-объект, чтобы EF мог заметить изменения в нем.

Как уже упоминалось в StriplingWarrior CreateObject<T> просто создает прокси-версию T, вы должны добавить его (длявставки) или Прикрепите его (для обновлений), чтобы EF узнал об этом.

Чтение между строками в вашем коде выглядит так, как будто вы хотите выполнить вставку?

Если это действительноесли прокси даже не требуется.

Почему?

Ну, вам не нужно отслеживать изменения уровня свойств (то есть, чтобы знать, какие свойства изменились), все, что вам нужно знать, это то, что объект является новым и должен быть вставлен.

Добавление вызова ctx.MyEntities.Add(...) сообщает EF, что.

Что означает, что для вставок этого достаточно:

var entity = new MyEntity();
... // set some props
ctx.MyEntities.Add(entity);
... // sets some more props
ctx.SaveChanges(); 

Или это

var entity = ctx.CreateObject<MyEntity>();
... // set some props
ctx.MyEntities.Add(entity);
... // sets some more props
ctx.SaveChanges(); 

будетобе работают.Но первое легче понять.

Надеюсь, это поможет

Алекс (Microsoft)

...