Использование динамических прокси POCO в Entity Framework - PullRequest
1 голос
/ 20 января 2012

В качестве примера у меня есть база данных с двумя таблицами, компанией и сотрудником, имеющими отношения один ко многим.Я использую EF 4

Я проходил книгу Джули Лерман и сеансы firestarter на канале 9 и у меня есть вопросы по использованию динамических прокси

  1. Упоминается, что при использовании динамических прокси создание новых объектов должно выполняться через ObjectContext.CreateObject, а не с использованием new Object () (для ссылки 1:09 в видео, упомянутом выше).Она ясно говорит, что если вы попытаетесь добавить объект таким образом, он не будет добавлен в базу данных, и я даже не получу ошибку.Однако я попробовал следующее, и это сработало

    try
        {
            using (var context = new sandeepTestEntities1())
            {
                var company1 = (from c1 in context.Companies
                                where c1.Name == "xyz"
                                select c1).Single();
    
                Employee e = new Employee();
                e.CompanyId = company1.Id;
                e.Age = 25;
                e.Name = "James";
    
                context.Employees.AddObject(e);
    
                context.SaveChanges();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    

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

  2. Также упоминается, что если у нас есть какой-либо пользовательский код в установщиках для сущностей, и мы используем динамические прокси, код не вызывается.(1:14 в видео).В моем примере для сущности Employee у меня есть следующий код для свойства name

    public virtual string Name
    {
           get{return _name;} 
            set
                {
                    if (value != null && value.Length > 50) 
                     {throw new ArgumentException("Name must be less than 50 characters");}
                else
                { _name = value;}
                }
    
        }
    

Я поменял код выше для создания сотрудника на

   try
        {
            using (var context = new sandeepTestEntities1())
            {
                var company1 = (from c1 in context.Companies
                                where c1.Name == "xyz"
                                select c1).Single();

                var e = context.CreateObject<Employee>();
                e.CompanyId = company1.Id;
                e.Age = 25;
                e.Name = "X".PadLeft(51,'.');

                context.Employees.AddObject(e);

                context.SaveChanges();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

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

...