在我的項目中,我們使用的是EF代碼第一次(v.6.0.0.0)和MS SQL Server 2012的實體框架6.0代碼第一 - 按主鍵
我在過濾時在一個簡單的查詢得到複製項目已經更新到實體框架第6版。 奇怪的是,在更新後的某個時候,我開始獲取重複的項目,同時通過主鍵過濾記錄。
首先,我開始得到「序列包含多個元素」在下面的代碼
var cateringService = context.CateringServices
.SingleOrDefault(x => x.Id == query.CateringServiceId)
我檢查了數據庫和參數例外 - 該Id
是主鍵 ,它被標記爲唯一,並且該參數是有效的。作爲Id
設定爲在映射主鍵:
this.HasKey(x => x.Id);
我已經取代了電話與FirstOrDefault
和代碼運行良好。 我試着檢索所有正在使用下面的代碼mathing謂詞的項目:
var cateringServices = context.CateringServices
.Where(x => x.Id == query.CateringServiceId)
.ToList();
看來,我得到了「CateringService」實體的13個實例引用同一行。請看附截圖:
除了我已經開始得到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實體。我們正在使用懶惰的方法,並啓用延遲加載。
當試圖使用Include("CateringService")
訪問'CateringService'時,所有的操作都很好,但我們不能只替換所有的SingleOrDefault
調用,並且在此時刪除項目中的所有惰性加載用法。
請指教。
UPDATE
對不起,我是不太清楚。 數據庫中有一條記錄與條件匹配。 Id
列設置爲主鍵,因此它是唯一的。
UPDATE 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') –
它是一個非常簡單的類的實例 - 只有一個屬性'public Int32 CateringServiceId {get;組; }' – danyloid
但我試過使用硬編碼值,例如'x => x.Id == 1'。或數據庫中的任何其他現有ID。仍然得到相同的結果。 – danyloid