В моя проект използваме EF Code First (v.6.0.0.0) и MS SQL Server 2012.
Актуализирах до Entity Framework до 6-та версия. Странното е, че в някакъв момент след актуализацията започнах да получавам дублирани елементи, докато филтрирах записи по първичния ключ.
Първо започнах да получавам изключение „Поредица съдържа повече от един елемент“ в следния код
var cateringService = context.CateringServices
.SingleOrDefault(x => x.Id == query.CateringServiceId)
Проверих базата данни и параметъра - Id
е първичен ключ, маркиран е като уникален и параметърът беше валиден. Тъй като Id
беше зададен като първичен ключ в картографирането:
this.HasKey(x => x.Id);
Замених обаждането с FirstOrDefault
и кодът работи добре. Опитах се да извлека всички елементи, които изравняват предиката, използвайки следния код:
var cateringServices = context.CateringServices
.Where(x => x.Id == query.CateringServiceId)
.ToList();
Изглежда, че получавам 13 екземпляра на обекта „CateringService“, препращащ към един и същ ред. Моля, вижте приложените екранни снимки:
Освен това започнах да получавам изключение A relationship multiplicity constraint violation occurred: An EntityReference can have no more than one related object, but the query returned more than one related object.
при достъп до обектите CateringService чрез препратка към обект. Използваме мързеливия подход и мързеливото зареждане е активирано.
Когато се опитвате да получите достъп до „CateringService“ с помощта на Include("CateringService")
всичко работи добре, но не можем просто да заменим всички SingleOrDefault
повиквания и да премахнем всички употреби на мързеливо зареждане от проекта в този момент.
Моля за съвет.
АКТУАЛИЗАЦИЯ
Съжалявам, че не съм съвсем ясен. В базата данни има един запис, който отговаря на условието. Колоната Id
е зададена като първичен ключ, така че е уникална.
АКТУАЛИЗАЦИЯ 2
По-долу е кодът от миграцията, генерирана от EF въз основа на плавни съпоставяния.
CreateTable(
"dbo.CateringServices",
c => new
{
Id = c.Int(nullable: false, identity: true),
Name = c.String(nullable: false, maxLength: 200),
CreatedDate = c.DateTime(nullable: false),
CultureString = c.String(maxLength: 10),
AddressId = c.Int(),
CateringServiceGroupId = c.Int(),
ContactInformationId = c.Int(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Addresses", t => t.AddressId, cascadeDelete: true)
.ForeignKey("dbo.CateringServiceGroups", t => t.CateringServiceGroupId)
.ForeignKey("dbo.ContactInformation", t => t.ContactInformationId, cascadeDelete: true)
.Index(t => t.AddressId)
.Index(t => t.CateringServiceGroupId)
.Index(t => t.ContactInformationId);
query
във вашия код? (x.Id == query.CateringServiceId
) - person Richard Deeming   schedule 16.12.2013public Int32 CateringServiceId { get; set; }
- person danyloid   schedule 16.12.2013x => x.Id == 1
. или всеки друг съществуващ идентификатор в базата данни. все още получава същия резултат. - person danyloid   schedule 16.12.2013Addresses
,CateringServiceGroups
иContactInformation
), за да видите дали съдържат дублиращи се записи? - person Richard Deeming   schedule 16.12.2013this.HasOptional(x => x.CateringService).WithOptionalDependent().Map(x => x.MapKey("CateringServiceId"));
. по някаква причина при заявка към таблицатаCateringServices
имаше ляво външно свързване. - person danyloid   schedule 16.12.2013CateringServices
и други обекти и това причинява дубликати. - person Aleksei Poliakov   schedule 21.12.2013