2

在我的通用存储库中,我需要编写通用的 Save 方法,该方法将根据 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);
    }
}

但是当我尝试做时,Linq 会产生异常Any( r=> (r as IKeyId)...不支持具有“MyProg.DAL.Appeal”类型输入和“Claimstrak.DAL.Interfaces.IKeyId”类型检查的“TypeAs”表达式。LINQ to Entities 查询仅支持实体类型和复杂类型。

怎么写才对?

4

1 回答 1

1

好吧,事实是您不需要使用 ObjectSet,您可以使用 DbContext 以更简单的方式执行此操作。

Bu,我会说这不是一个好的模式,在存储库中调用 Save()。我建议您仅在完成后才考虑 Context 的 .SaveSession() ,这样您可以在往返于 te 数据库之前做很多事情。

所以,你应该创建一个这样的方法,但不要调用 SaveChanges(),而不是 Save() 方法,调用 UpdateOrInsert() 和它们,毕竟你调用了 .Save()

但是我会根据您的要求给出示例(但我不推荐,我建议您将 IUnitOfWork 与 IRepository 分开)

看看代码如何非常简单:

    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;
    }

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

于 2013-05-15T21:25:34.720 回答