为_context创建扩展方法以分离本地实体

时间:2019-01-20 19:39:21

标签: c# asp.net

我正在尝试使HttpPut请求正常工作,但是下面的行引发异常,因为本地StockItem尚未分离。

_context.Entry(StockItem).State = EntityState.Modified;

因此,我需要在修改它之前分离本地StockItem。 StockItem实体看起来像这样:

public class StockItem
    {
        public int Id { get; set; }

        public int ProductId { get; set; }

        public Product Product { get; set; }

        public int StockId { get; set; }

        public DateTime BestBy { get; set; }

        public double Amount { get; set; }
    }

我想创建一个扩展以在其他HttpPut请求中重用它。我发现此代码段几乎可以正常工作:

public static class Detacher
{
    public static void DetachLocal<T>(this WebAppDbContext context, int entryId)
where T : class, IIdentifier
    {
        //find local entity by Id
        var local = context.Set<T>()
            .Local
            .FirstOrDefault(entry => entry.Id.Equals(entryId));
        if (!(local==null))
        {
            //detach it
            context.Entry(local).State = Microsoft.EntityFrameworkCore.EntityState.Detached;
        }
    }
}

public interface IIdentifier
{ 
        int Id { get; set; }

}

但是如果我将StockItem类型传递给此扩展名,则会出现错误

_context.DetachLocal<StockItem>(id);
  

CS0311类型'WebApi.Entities.StockItem'不能用作   通用类型或方法中的类型参数“ T”   'Detacher.DetachLocal(WebAppDbContext,int)'。没有隐含   从“ WebApi.Entities.StockItem”到   “ WebApi.IIdentifier”。

1 个答案:

答案 0 :(得分:0)

看看界面

public interface IIdentifier
{  
    int Id { get; set; }

现在您的实体

public class StockItem

它实现接口吗?不。

可能吗?是。它具有所有必需的成员(Id)。

替换

public class StockItem

使用

public class StockItem : IIdentifier

然后。