在Entity Framework中使用动态代理POCO

时间:2012-01-20 16:33:26

标签: c# entity-framework entity-framework-4 poco

作为一个例子,我有一个包含两个表的数据库,公司和员工有一对多的关系。我正在使用EF 4

我正在浏览Julie Lerman's book以及channel 9上的firestarter会话,并对使用动态代理有一些疑问

  1. 提到使用动态代理时,新对象的创建应该通过ObjectContext.CreateObject完成,而不是通过说新的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. 还提到如果我们在实体的setter中有任何自定义代码,并且我们使用动态代理,则代码不会被调用。 (视频中的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;}
                }
    
        }
    
  3. 我将上面的代码用于创建员工

       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());
            }
    

    我在分配名称时仍然会收到异常,表明我的自定义代码正在被调用。我对这两点的理解是否不正确?

0 个答案:

没有答案