具有泛型和对象数据源的存储库模式

本文关键字:存储 模式 数据源 对象 泛型 | 更新日期: 2023-09-27 18:11:45

我对实体框架不熟悉,对c#也比较陌生。我正在使用实体框架与存储库模式。我有一个DAL项目,一个业务层项目和一个web项目,其中有aspx页面以及ObjectDataSource。现在我已经为所有实体创建了单独的存储库,我想使用通用存储库来处理所有基本的CRUD功能。我可以为代码示例中的所有实体创建通用实体DAL类,并在通用存储库中继承它,但使用对象数据源,我如何

1)映射ObjectDataSource的TypeName到泛型类型?赋值TypeName和
ObjectDataTypeName吗?业务层泛型类继承泛型IDALEntity类。

 <asp:ObjectDataSource  ID="ODSCustomers" runat="server"
       TypeName="SampleProject.BLL.  " how do i access the Customer instance of BL  
       DataObjectTypeName="SampleProject.DAL. " how do i access the instance of 
                                                Customer entity from the generic DAL 
                                                class? 
       SelectMethod="GetCustomers" >
       <SelectParameters>
         <asp:SessionParameter Name="client_id" SessionField="ClientID" />
       </SelectParameters>

2)如何以这种方式处理相关实体或导航属性?如果我想显示来自多个实体的列,例如Customer实体和Customer。CustomerAddress实体以及我将绑定网格列,如datafed ="Customer.CustomerAddress。城市"?

public class DALEntityRepository<T> : IDisposable, IDALEntityRepository<T> where T : class
{
    private PFOEntities _context;
    private ObjectSet<T> _objectSet;
    public DALEntityRepository()
    {
        _context = new Entities(ConnectionStringHelper.GetConnectionString());
        _objectSet = (ObjectSet<T>)GetObjectSet();
    }

    public void Insert(T entity)
    {
        _context.AddObject(_objectSet.EntitySet.Name, entity);
        _context.SaveChanges();
    }
    public void Update(T newVersion, T origVersion)
    {
        _objectSet.Attach(origVersion);
        _context.ApplyCurrentValues(_objectSet.EntitySet.Name, newVersion);
        _context.SaveChanges();
    }
    public void Delete(T entity)
    {
        _context.AttachTo(_objectSet.EntitySet.Name, entity);
        _objectSet.DeleteObject(entity);
        _context.SaveChanges();
    }
    public IQueryable<T> GetEntities()
    {
        return _objectSet;
    }
    public IQueryable<T> GetEntitiesByClientId(int clientId)
    {
        Expression<Func<T, bool>> predicate = (Expression<Func<T, bool>>)GetPredicate(clientId);
        return GetEntities().Where(predicate);
    }

  private object GetPredicate(int clientId)
    {
        object retVal = null;
        Type type = GetType();
        //Use similar if's to check for Different Entities
        if (type == typeof(DataEntityRepository<Customers>))
        {
            Expression<Func<Customers, bool>> predicate = (c) => c.client_id ==    
           clientId;
            retVal = predicate;
        }
                 return retVal;
    }
    private object GetObjectSet()
    {
        object retVal = null;
        Type type = GetType();
        if(type == typeof(DataEntityRepository<Customers>))
        {
            retVal = _context.Customers;
        }
              return retVal;
    }

感谢您的帮助,如果我没有解释清楚,或者如果您有任何问题,请告诉我,谢谢。

具有泛型和对象数据源的存储库模式

对于您的第一个问题,请参考:使用ObjectDataSource的泛型类或更多的ASP。. NET解决方案:http://www.manuelabadia.com/blog/PermaLink,guid,91a1d00f-197e-4148-b4e1-cea324029dc6.aspx

关于你的第二个问题:

是的,您可以通过遵循导航属性来引用相关实体,但是有一个问题。如果你没有在输出中包含导航属性(通过导航它们,选择它们或使用include语句),并且延迟加载被禁用,你将得到一个NullReferenceException,因为导航属性没有被加载。

我的建议是在查询中强制包含导航属性,参见:http://msdn.microsoft.com/en-us/library/bb738708.aspx