Существует разница между добавлением объекта в контекст данных (и распространением его обратно в базу данных) и добавлением его в связанную коллекцию объектов объекта, который вы извлекли из базы данных.После того как вы извлекли объект и связанные с ним объекты, внесение изменений в данные в базе данных не будет отражено в извлеченном объекте, поскольку база данных не требуется.Ключевой бит - это SingleOrDefault()
для компании, который заставляет выполнить запрос и присвоить извлеченные данные.Перечисление связанных объектов приведет к их загрузке, если они еще не загружены.Таким образом, даже после обновления базы данных ранее извлеченный объект не будет отражать обновление.Однако вы можете добавить вставленный объект в коллекцию соответствия данных компании, а затем выполнить обновление, и это будет именно то, что вы ожидаете.Обратите внимание, что я думаю, что вам все еще нужно назначить связанный объект, который вы используете в своем чеке.Обновление страницы также решает проблему, поскольку данные запрашиваются из базы данных, обновляются связанные коллекции сущностей, а также таблицы в контексте данных.
Company c = DC.Companies.SingleOrDefault(x => x.Name == companyName);
var compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);
if (compliances.Count() == 0) // Insert one if not exist yet
{
c.DataCompliances.Add( new DataCompliance
{
ComplianceCriteria = criteria
});
DC.SubmitChanges();
compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);
}
Оригинал (оставленоcontext)
Что если вы попытаетесь назначить ассоциированный объект вместо его идентификатора?Я считаю, что присвоение идентификатора фактически не заполняет связанный объект, который проверяется, и SubmitChanges только распространяет данные обратно в БД, а не обновляет элемент таблицы данными для связанного объекта.
var compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);
if (compliances.Count() == 0) // Insert one if not exist yet
{
DC.DataCompliances.InsertOnSubmit(new DataCompliance {
FKCompany = c.Id,
ComplianceCriteria = criteria
});
DC.SubmitChanges();
compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);
}