簡體   English   中英

具有單個ID實體框架的.Find上的主鍵錯誤

[英]Primary Key Error on .Find with single Id Entity Framework

我在使用單個PK的實體上執行.find時遇到問題。

基類如下:

public abstract class Entity : IEntity
{
    public int Id { get; set; }

    public bool? IsArchived { get; set; }
}

這個班是

public class Manufacturer : Entity
{
    public string Name { get; set; }
}

但是,當我嘗試在制造商上進行HTTPPUT時,出現以下錯誤;

傳遞的主鍵值的數量必須與在實體上定義的主鍵值的數量匹配。 參數名稱:keyValues

當我在集合上調用.find方法時,會拋出該異常;

    public T Find<T>(int id, params Expression<Func<T, object>>[] includes) where T : class, IEntity
    {
        return this.Set<T>().Find(id, includes);
    }

任何想法為什么會這樣?

更新資料

我先運行代碼。 數據庫已生成(這是通過VS表設計完成的)PK_dbo.Manufacturers(主鍵,群集:Id)

我正在使用SOLID架構,我的控制器如下:

    [HttpPut]
    [Route("")]
    public Manufacturer Put(Manufacturer m)
    {
        var response = ManufactureService.UpdateManufacturer(m);

        return response.Result;
    }

其中ManufacturerService如下;

    public ServiceResponse<Manufacturer> UpdateManufacturer(Manufacturer obj)
    {
        Func<Manufacturer> func = delegate
        {
            using (var context = _contextFactory())
            {
                var manufacturer = context.Find<Manufacturer>(obj.Id);
                manufacturer.Name = obj.Name;
                manufacturer.IsArchived = manufacturer.IsArchived;

                context.Update(manufacturer);

                return manufacturer;
            }
        };

        return this.Execute(func);
    }

其中obj是傳遞的要更新的制造商。 並且id是整數。

為了提供更多信息,我有一個聯系,然后使用以下內容;

    public T Find<T>(int id, params Expression<Func<T, object>>[] includes) where T : class, IEntity
    {
        return this.Set<T>().Find(id, includes);
    }

如果在制造商上失敗,並且唯一的列是名稱,那么將您的調用堆棧歸咎於Find(int id)就是零。 該表上沒有整數主鍵。 也許那是你的問題。

更新

請嘗試將Entity類中的代碼復制到Manufacturer中。 然后刪除子類關系。 然后看您的看跌期權是否仍然失敗。

您將兩個鍵值傳遞給“查找”,但是EF僅能推斷出Id是PK。 您是否真的想將可為空的布爾值作為PK的一部分? 我不確定是否允許這樣做。 如果您確實希望將可為空的布爾作為密鑰的一部分,那么我認為您需要讓EF知道這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM