В моем проекте мы используем 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