我正在通过apress关注asp.net mvc 5的书,我因此错误而陷入困境:
“SportsStore.Domain.Concrete.EFProductRepository”未实现 接口成员 “SportsStore.Domain.Abstract.IProductRepository.Products.set“
这就是我在EFProductRepository中所拥有的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SportsStore.Domain.Abstract;
using SportsStore.Domain.Entities;
namespace SportsStore.Domain.Concrete
{
public class EFProductRepository : IProductRepository
{
public EFDbContext context = new EFDbContext();
public IEnumerable<Product> Products
{
get { return context.Products; }
}
}
}
在IProductRepository中我有:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SportsStore.Domain.Entities;
namespace SportsStore.Domain.Abstract
{
public interface IProductRepository
{
IEnumerable<Product> Products { get; set; }
}
}
知道我为什么在EFProductRepository.cs类中收到错误? 提前感谢Laziale的所有建议
答案 0 :(得分:5)
因为您没有为该属性实现setter。查看界面的定义:
IEnumerable<Product> Products { get; set; }
看看你的实施:
public IEnumerable<Product> Products
{
get { return context.Products; }
}
您需要在属性中实现set
,或从接口定义中删除set
。鉴于该物业的实施,我猜测后者更合适。
如果它有帮助,因为看起来你正在构建Entity Framework对象的存储库,这是我的一般看起来像:
public interface ProductRepository
{
IQueryable<Product> Products { get; }
void Add(Product model);
void Remove(Product model);
}
和实施:
public class ProductRepositoryImplementation : ProductRepository
{
private DbSet<Product> _products;
public IQueryable<Product> Products
{
get { return _products; }
}
public ProductRepositoryImplementation(DbSet<Product> products)
{
_products = products;
}
public void Add(Product model)
{
_products.Add(model);
}
public void Remove(Product model)
{
_products.Remove(model);
}
}
通常,它位于工作对象单元内,工作对象扩展DbContext
并处理将更改提交到其存储库。 (这也是将DbSet<>
传递给存储库的构造函数的原因。)我今天实际上just blogged关于此设置。
答案 1 :(得分:2)
错误似乎很清楚 - 您需要在属性中添加set
访问者或从界面中删除它。在您的情况下,从界面中删除它可能更有意义:
namespace SportsStore.Domain.Abstract
{
public interface IProductRepository
{
IEnumerable<Product> Products { get; /*set;*/ }
}
}
通过set
访问器将实体添加到存储库似乎不合适 - 通常存储库具有Save
或Update
方法,一次只能在一个实体上运行。