Можно ли увидеть добавленные объекты из несохраненного контекста EF4? - PullRequest
3 голосов
/ 02 сентября 2010

Я только вхожу в Entity Framework 4 и в конце концов надеялся обернуть его в шаблон репозитория, используя POCO. Я обнаружил то, чего не ожидал. Похоже, что если вы создаете контекст, добавляете к нему объект (без сохранения контекста) и снова запрашиваете контекст, он не включает новый объект в результаты. Я делаю что-то неправильно? Похоже, он должен вернуть то, что я добавил, даже если я еще не сохранил результаты обратно в базу данных. Вот мой пример кода:

  ShopEntities context = new ShopEntities();

  // there is only 1 customer so far
  var customers = from c in context.Customers
              select c;

  Console.WriteLine(customers.Count()); // displays 1

  Customer newCustomer = context.Customers.CreateObject();
  newCustomer.FirstName = "Joe";
  newCustomer.LastName = "Smith";

  context.Customers.AddObject(newCustomer);

  var customers2 = from c in context.Customers
               select c;

  Console.WriteLine(customers2.Count()); // still only displays 1

  context.SaveChanges();

  var customers3 = from c in context.Customers
               select c;

  Console.WriteLine(customers3.Count()); // only after saving does it display 2

Ответы [ 2 ]

5 голосов
/ 02 сентября 2010

Запрос L2E всегда возвращает объекты из БД. Он объединит их с изменениями в памяти на основе MergeOption.

запроса.

Чтобы увидеть добавленные объекты, посмотрите на контекст:

var addedCustomers = from se in context.ObjectStateManager.GetObjectStateEntries(EntityState.Added)
                     where se.Entity is Customer
                     select se.Entity;
0 голосов
/ 12 февраля 2019

Использовать свойство ChangeTracker:

   public delegate void SaveEventHandler(Dictionary<EntityState, List<IAuditable>> entities);
   public event SaveEventHandler OnReturnAuditableEntitiesAfterSaveEvent;

public override Task<int> SaveChangesAsync()
    {
        try
        {
            if (OnReturnAuditableEntitiesAfterSaveEvent != null)
            {
                List< EntityState > states = new List<EntityState>()
                {
                    EntityState.Added,
                    EntityState.Deleted,
                    EntityState.Modified
                };

                Dictionary<EntityState, List<IAuditable>> entities = new Dictionary<EntityState, List<IAuditable>>();

                List<DbEntityEntry> unsavedEntities = ChangeTracker.Entries()
                    .Where(p => p.Entity is IAuditable && states.Contains(p.State))
                    .ToList();

                foreach (var state in states)
                {
                    List<DbEntityEntry> list = unsavedEntities.Where(c => c.State == state).ToList();
                    if (list.Count > 0)
                    {
                        switch (state)
                        {
                            case EntityState.Added:
                            case EntityState.Deleted:
                                entities.Add(state, list.Select(c=> c.Entity as IAuditable).ToList());
                                break;

                            case EntityState.Modified:
                                List<IAuditable> modifiedAntities = new List<IAuditable>();
                                //Check for modified entities if the value has changed
                                foreach (var entry in list)
                                {
                                    foreach (var prop in entry.OriginalValues.PropertyNames)
                                    {
                                        var originalValue = entry.OriginalValues[prop].ToString();
                                        var currentValue = entry.CurrentValues[prop].ToString();
                                        if (originalValue != currentValue)
                                        {
                                            modifiedAntities.Add(entry.Entity as IAuditable);
                                        }
                                    }
                                }

                                if (modifiedAntities.Count > 0)
                                    entities.Add(state, modifiedAntities);
                                break;

                            default:
                                break;
                        }
                    }
                }

                if (entities.Count > 0)
                    OnReturnAuditableEntitiesAfterSaveEvent.Invoke(entities);
            }

            return base.SaveChangesAsync();
        }
        catch (DbEntityValidationException ex)
        {
            throw CollectValidationErrors(ex);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...