这应该是非常明显的,但由于某种原因,我无法弄明白。所以在我的通用存储库类中,我有一个更新实体的更新方法:
public void Update<TEntity>(TEntity entity) where TEntity : class, IBusinessEntity
{
try
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
TEntity existing = _context.Set<TEntity>().Find(entity.Id);
if (existing != null)
{
_context.Entry(existing).CurrentValues.SetValues(entity);
this._context.SaveChanges();
}
}
catch (DbEntityValidationException dbEx)
{
var msg = string.Empty;
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
msg += Environment.NewLine + string.Format("Property: {0} Error: {1}",
validationError.PropertyName, validationError.ErrorMessage);
}
}
var fail = new Exception(msg, dbEx);
throw fail;
}
}
问题是我在这一行收到错误:
_context.Entry(existing).CurrentValues.SetValues(entity);
我在条目下得到一个红色波浪形,错误读取
IBusinessEntityContext不包含“Entry”的定义,并且没有可以找到接受IBusinessEntityContext类型的第一个参数的扩展方法“Entry”(您是否缺少using指令或程序集引用?)
这是我的IBusinessEntityContext类:
namespace ContentManager.Employees.EF
{
using System.Data.Entity;
using Models.Employees;
public interface IBusinessEntityContext
{
DbSet<TEntity> Set<TEntity>() where TEntity : class, IBusinessEntity;
int SaveChanges();
}
}
我的存储库类顶部有一堆using语句:
namespace ContentManager.Employees.EF
{
using System;
using System.Data.Entity.Validation;
using System.Linq;
using System.Reflection;
using System.Data.Entity;
using Models.Employees;
using Models.Employees.EF;
using System.Data.Entity.Infrastructure;
public class EFEmployeeEntityRepository : IEFEmployeeEntityRepository
{
// bunch of code
}
}
Here is the documentation for DbContext.Entry Method (TEntity)。它说命名空间只是System.Data.Entity,我正在使用它。从上面的代码中可以看出,此存储库实现了IEFEmployeeEntityRepository。如有必要,代码如下:
namespace ContentManager.Employees.EF
{
using System.Linq;
using Models.Employees.EF;
public interface IEFEmployeeEntityRepository: IEmployeeEntityRepository
{
IQueryable<TEntity> BeginQuery<TEntity>() where TEntity : EFBusinessEntity;
}
}
这个类扩展了IEmployeeEntityRepository,所以代码就在这里:
public interface IEmployeeEntityRepository
{
TEntity GetById<TEntity>(Guid id) where TEntity : class, IBusinessEntity;
void Insert<TEntity>(TEntity entity) where TEntity : class, IBusinessEntity;
void Update<TEntity>(TEntity entity) where TEntity : class, IBusinessEntity;
void Delete<TEntity>(TEntity entity) where TEntity : class, IBusinessEntity;
}
有谁知道为什么我不能使用Entry方法?文档说该方法只是
public DbEntityEntry<TEntity> Entry<TEntity>(
TEntity entity
)
where TEntity : class
所以我想知道我是否可以自己写这个方法?但后来我担心该行中的其他方法(即CurrentValues.SetValues(entity))也不会起作用。或者,这条线甚至是必要的吗?我从中获取代码的教程只用
编写了更新方法this._context.SaveChanges();
但我觉得这没有做任何事情,所以我加入了
_context.Entry(existing).CurrentValues.SetValues(entity);
但我不确定这是否正确。
答案 0 :(得分:2)
问题是在您的Update方法中,所有编译器都知道_context
的类型为IBusinessEntityContext
且编译器不知道_context
在某处有DbContext
类型在它的继承树中。您可以将其添加到您的界面:
public interface IBusinessEntityContext
{
DbSet<TEntity> Set<TEntity>() where TEntity : class, IBusinessEntity;
int SaveChanges();
// Add this
DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class, IBusinessEntity;
}