Хотя таблицы ссылок, которые облегчают отношения многие ко многим, как правило, скрыты EF, у меня есть случай, когда я думаю Мне нужно создать (и управлять) самому:
У меня есть следующие объекты:
public class TemplateField
{
public int Id
{
get;
set;
}
[Required]
public string Name
{
get;
set;
}
}
public class TemplateFieldInstance
{
public int Id
{
get;
set;
}
public bool IsRequired
{
get;
set;
}
[Required]
public virtual TemplateField Field
{
get;
set;
}
[Required]
public virtual Template Template
{
get;
set;
}
}
public class Template
{
public int Id
{
get;
set;
}
public string Name
{
get;
set;
}
public virtual ICollection<TemplateFieldInstance> Instances
{
get;
set;
}
}
Так по существу; Template
может иметь много TemplateField
, а TemplateField
может иметь много Template
.
Полагаю, я мог бы просто добавить свойство навигации в виде набора Template
элементов в сущности TemplateField
и заставить EF управлять сущностью ссылки, но мне нужно хранить некоторую дополнительную информацию об отношениях, поэтому IsRequired
свойство на TemplateFieldInstance
.
Фактическая проблема, с которой я сталкиваюсь - это обновление Template
Я использую код, подобный следующему:
var template = ... // The updated template.
using (var context = new ExampleContext())
{
// LoadedTemplates is just Templates with an Include for the child Instances.
var currentTemplate = context.LoadedTemplates.Single(t => t.Id == template.Id);
currentTemplate.Instances = template.Instances;
context.Entry(currentTemplate).CurrentValues.SetValues(template);
context.SaveChanges();
}
Тем не менее, если я попытаюсь обновить Template
, например, чтобы удалить одну из TemplateFieldInstance
сущностей, то при этом выдается исключение (с внутренним исключением), которое гласит:
Отношение из TemplateFieldInstance_Template.
AssociationSet находится в состоянии «Удалено». Учитывая множественность
ограничения, соответствующий TemplateFieldInstance_Template_Source
также должен находиться в состоянии «Удалено».
После некоторого исследования это звучит так, потому что EF по существу пометил внешний ключ TemplateFieldInstance
для Template
как нулевой, а затем попытался сохранить его, что нарушило бы ограничение Required
.
Я очень новичок в Entity Framework, так что для меня это все путешествие в путешествие, поэтому я полностью ожидаю, что в моем подходе будут ошибки или как я делаю обновление!
Заранее спасибо.