[英]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.