作为一个例子,我有一个包含两个表的数据库,公司和员工有一对多的关系。我正在使用EF 4
我正在浏览Julie Lerman's book以及channel 9上的firestarter会话,并对使用动态代理有一些疑问
提到使用动态代理时,新对象的创建应该通过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方法。我觉得它可能与关系和外键修复有关,但即使在使用上面的代码时也能正常工作。
还提到如果我们在实体的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;}
}
}
我将上面的代码用于创建员工
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());
}
我在分配名称时仍然会收到异常,表明我的自定义代码正在被调用。我对这两点的理解是否不正确?