Необходимо понимать ссылочные состояния Entity Framework - PullRequest
0 голосов
/ 16 февраля 2010

Я впервые внедряю структуру сущностей. Я работаю с добавлением / обновлением объектов, которые имеют родительское свойство.

Мне известно, что родительская сущность сущности инициализируется как "ноль". У меня нет полного понимания того, как использовать родительскую сущность в сравнении со справочными полями родительской сущности или что требуется для сохранения изменений в сущности.

  1. Я упускаю какие-либо важные факторы в моем анализе (т. Е. EntityState?)
  2. Какие из следующих ситуаций возможны, и
  3. Какой метод борьбы с ними является лучшим:

Сущность: ноль
EntityReference: не нуль

Сущность: не ноль
EntityReference: null

Сущность: не ноль
EntityReference: не нуль

Спасибо за любую помощь.

пример кода:

internal void AddUpdateObject(MyDataContext context)
{
// HOW DO I HANDLE THIS SECTION vvvv
if (this.MyParentEntity == null)
{
    throw new Exception("Parent Property Null.");
}
if (this.MyParentEntity.EntityState == EntityState.Detached)
{
    MyParentEntity t = this.MyParentEntity;
    this.MyParentEntity = null;
    context.AttachTo("ParentCollection", t);
    this.MyParentEntity = t;
}
// ^^^^^^^^^
try
{
    context.AddToMyEntities(this);
}
catch (InvalidOperationException)
{
    // the object with the key already exists
    MyEntity ent = context.MyEntities.First(x => x.id == this.id);
    PropertyInfo[] props = typeof(MyEntity).GetProperties();
    foreach (PropertyInfo pi in props)
    {
        if (pi.CanRead && pi.CanWrite &&
            !pi.PropertyType.Name.StartsWith("EntityCollection") &&
            !pi.Name.Equals("id"))
            pi.SetValue(ent, pi.GetValue(this, null), null);
    }
}
}

Ответы [ 2 ]

0 голосов
/ 16 февраля 2010

Вот что сработало:

MyEntity e = context.MyEntities.FirstOrDefault(x => x.id == this.id);
if(e == null){
    MyParent p = this.Parent;
    this.Parent = null;
    context.Attach(p);
    this.Parent = p;
}
else
{
    context.ApplyPropertyChanges("MyEntities", this);
}

Некоторые справочные ссылки:
ApplyPropertyChanges
Добавление объектов со ссылками на другие объекты

0 голосов
/ 16 февраля 2010

Вы можете сделать что-то вроде:

var entity = context.MyEntities.FirstOrDefault(x => x.id == this.id);
if (entity != null)
{
    // updating
    // HOW DO I HANDLE THIS SECTION vvvv
    if (!entity.MyParentEntityReference.IsLoaded)
    {
        entity.MyParentEntityReference.Load();
    }
}
else
{
    // inserting
    entity = this;
    context.AddToMyEntities(this);
    this.ParentEntity = // whatever
}
entity.SomeOtherProperty = someValue;
context.SaveChanges();

Это отвечает на ваш вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...