Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 上的主键错误。使用单Id实体框架查找_C#_Entity Framework - Fatal编程技术网

C# 上的主键错误。使用单Id实体框架查找

C# 上的主键错误。使用单Id实体框架查找,c#,entity-framework,C#,Entity Framework,我在对具有单个PK的实体执行.find时遇到问题 基类如下所示 public abstract class Entity : IEntity { public int Id { get; set; } public bool? IsArchived { get; set; } } [HttpPut] [Route("")] public Manufacturer Put(Manufacturer m) { var respons

我在对具有单个PK的实体执行.find时遇到问题

基类如下所示

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

    public bool? IsArchived { get; set; }
}
    [HttpPut]
    [Route("")]
    public Manufacturer Put(Manufacturer m)
    {
        var response = ManufactureService.UpdateManufacturer(m);

        return response.Result;
    }
    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);
    }
这个班是

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);
    }
制造商服务如下:

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

    public bool? IsArchived { get; set; }
}
    [HttpPut]
    [Route("")]
    public Manufacturer Put(Manufacturer m)
    {
        var response = ManufactureService.UpdateManufacturer(m);

        return response.Result;
    }
    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)
{
Func Func=委托
{
使用(var context=_contextFactory())
{
var manufacturer=context.Find(obj.Id);
制造商名称=对象名称;
manufacturer.IsArchived=manufacturer.IsArchived;
上下文更新(制造商);
退货制造商;
}
};
返回此.Execute(func);
}
其中obj是要更新的合格制造商。id是一个整数

为了提供更多的信息,我有一个contect,然后使用以下内容:

    public T Find<T>(int id, params Expression<Func<T, object>>[] includes) where T : class, IEntity
    {
        return this.Set<T>().Find(id, includes);
    }
public T-Find(int-id,参数表达式[]包含),其中T:class,icity
{
返回此.Set().Find(id,includes);
}

如果它在Manufacturer上失败,并且唯一的一列是Name,那么调用堆栈责怪Find(int-id)就毫无意义。此表上没有整数主键。也许这就是你的问题

更新


请尝试将实体类中的代码复制到制造商中。然后删除子类关系。然后看看您的put是否仍然失败。

您传递了两个键值以查找,但EF只能推断该Id是PK。你真的想要一个可为空的布尔值作为你PK的一部分吗?我不确定这是否被允许。如果您确实希望将可空布尔值作为密钥的一部分,那么我认为您需要让EF知道。

听起来您的实体定义了两个(或零个)主键。我同意。但有一个事实是,我从实体继承了许多不同的类,在这些类中,put起作用??。我还尝试添加[Key]属性。关于我能做的进一步调查的想法?你使用哪种方法?代码优先还是数据优先?如果答案是第一个,并且您已经在edmx中设置了PK,请记住首先更新数据库。编码。但是我没有使用.edmx。我认为这可能是问题所在,于是运行了一次添加迁移,但up方法是空的。为什么要将所有内容都放在Func中?为了让我们更容易理解,您是否过度简化了应用程序中的代码?John,感谢您的评论,它继承了实体基类的形式,该实体基类具有int-Id。我已更新了问题,以包含对的服务调用。find@JohnZabroski这只是猜测,不是答案。这本应作为一条评论发布,要求对架构进行进一步澄清。@DavidL感谢您的评论。如上所述,该模式似乎指向基类Id中的一个PK。@DavidL是否了解导致此问题的原因?您需要进一步的代码吗?好的,我知道您是如何得出这个结论的,但是我尝试将属性[Key]添加到id中,但没有成功(我已经这样做了,并运行了迁移,证明Up()方法没有显示db更改),您对Find的调用传递了2个键。您需要定义两个键。