В качестве примера у меня есть база данных с двумя таблицами, компанией и сотрудником, имеющими отношения один ко многим.Я использую EF 4
Я проходил книгу Джули Лерман и сеансы firestarter на канале 9 и у меня есть вопросы по использованию динамических прокси
Упоминается, что при использовании динамических прокси создание новых объектов должно выполняться через 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 в этом сценарии.Я чувствовал, что это может быть как-то связано с исправлением отношений и внешнего ключа, но даже это работает при использовании кода выше.
Также упоминается, что если у нас есть какой-либо пользовательский код в установщиках для сущностей, и мы используем динамические прокси, код не вызывается.(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());
}
и я все еще получаю исключение при назначении имени, указывающего, что мой пользовательский код вызывается.Мое понимание обоих этих пунктов неверно?