Шаблон репозитория с универсальными и объектными источниками данных - PullRequest
0 голосов
/ 18 октября 2011

Я новичок в Entity Framework и относительно плохо знаком с C #.Я использую Entity Framework с шаблоном репозитория.У меня есть проект DAL, проект бизнес-уровня и веб-проект, который имеет страницы aspx вместе с ObjectDataSource.Прямо сейчас я создаю отдельные репозитории для всех моих сущностей, я хотел бы использовать универсальный репозиторий для обработки всех основных функций CRUD.Я могу создать класс DAL для универсального объекта для всех объектов, как показано ниже в примере кода, и наследовать его в универсальном репозитории, но с источником данных объекта. Как мне

1) сопоставить TypeName ObjectDataSource с универсальным типом?назначить TypeName и
ObjectDataTypeName?Универсальный класс Business Layer наследует универсальный класс 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, я бы связал столбцы сетки, например, DataFied = "Customer.CustomerAddress.City"?

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

Ваша помощь оценена, пожалуйста, дайте мне знать, если я не объяснил четко или если у вас есть какие-либо вопросы, спасибо.

1 Ответ

0 голосов
/ 18 октября 2011

По первому вопросу обращайтесь: Использование универсальных классов с 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...