Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
Asp.net mvc 通用保存方法_Asp.net Mvc_Linq_Entity Framework_Generics_Asp.net Mvc 4 - Fatal编程技术网

Asp.net mvc 通用保存方法

Asp.net mvc 通用保存方法,asp.net-mvc,linq,entity-framework,generics,asp.net-mvc-4,Asp.net Mvc,Linq,Entity Framework,Generics,Asp.net Mvc 4,在我的通用存储库中,我需要编写通用保存方法,该方法将根据id编辑现有实体或添加新实体 public void Save<T>(T entity) where T : TEntity, IKeyId { if (ObjectSet.Any(r => (r as IKeyId).KeyId == entity.KeyId)) { Edit(entity); } else { Add(entity); }

在我的通用存储库中,我需要编写通用保存方法,该方法将根据id编辑现有实体或添加新实体

public void Save<T>(T entity) where T : TEntity, IKeyId
{
    if (ObjectSet.Any(r => (r as IKeyId).KeyId == entity.KeyId))
    {
        Edit(entity);
    }
    else
    {
        Add(entity);
    }
}
public void Save(T实体),其中T:tenty,IKeyId
{
if(ObjectSet.Any(r=>(r作为IKeyId.KeyId==entity.KeyId))
{
编辑(实体);
}
其他的
{
添加(实体);
}
}
但当我尝试执行
Any(r=>(r作为IKeyId)…
时,Linq会生成异常。 不支持输入类型为“MyProg.DAL.Appeal”且检查类型为“Claimstrak.DAL.Interfaces.IKeyId”的“TypeAs”表达式。LINQ to Entities查询中仅支持实体类型和复杂类型


如何正确地编写它?

事实上,您不需要使用ObjectSet,只需使用DbContext,以一种更简单的方式来完成

Bu,我会告诉你,这不是一个好的使用模式,在存储库中调用SAVER()。我会重申,在所有的工作完成之后,你只考虑上下文的.SaveSeSeSe(),这样你就可以做很多事情去TE数据库。 因此,您应该创建一个这样的方法,但不要将SaveChanges()而不是Save()方法调用到UpdateOrInsert()和它们,在所有操作完成后,您可以调用.Save()方法

但我会根据你的要求给出一个例子(但我不建议,我建议你将我的工作与我的假设分开)

看看代码是如何非常简单的:

    interface IKeyId
    {
        int Id { get; set; }
    }

    DbContext context = new YourContext();

    public bool Save<TEntity>(TEntity entity) where TEntity : class, IKeyId
    {
        return (entity.Id == 0) ? Add<TEntity>(entity) : Edit<TEntity>(entity);
    }

    public bool Edit<TEntity>(TEntity entity) where TEntity : class, IKeyId
    {
        var set = context.Set<TEntity>();
        set.Attach(entity);
        return true;
    }

    public bool Add<TEntity>(TEntity entity) where TEntity : class, IKeyId
    {
        var set = context.Set<TEntity>();
        set.Add(entity);
        return true;
    }
接口IKeyId
{
int Id{get;set;}
}
DbContext=newyourcontext();
公共bool Save(tenty实体),其中tenty:class,IKeyId
{
返回(entity.Id==0)?增加(entity):编辑(entity);
}
公共布尔编辑(tenty实体),其中tenty:class,IKeyId
{
var set=context.set();
集合。附加(实体);
返回true;
}
公共bool Add(tenty实体),其中tenty:class,IKeyId
{
var set=context.set();
设置、添加(实体);
返回true;
}

我在我的存储库中使用了类似的方法,我更改了T4(.tt文件)这将从我的数据库生成POCO类,以方便地实现我拥有的一些接口,例如IAuditable、IValidatable和其他接口,因此T4将自动在类中实现这些接口。

好的,例外是很明显的,您不能使用linq中的接口转换为实体…现在,为了找到解决方案,请稍微详细一点e(例如,为了理解如何以及为什么使用ObjectSet)会很有用。您知道EF会告诉您实体是新的、修改的还是删除的。我知道。不幸的是,该表中的键(id)不是自己的id。列是对另一个表的引用,不是标识。