繁体   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