Nano Hash - криптовалюты, майнинг, программирование

Есть ли недостатки в передаче объекта DataContext в качестве параметра ref?

Итак, в моем проекте EF4 я открыл частичные классы как самого файла DataContext, так и пару таблиц/объектов, сгенерированных DataContext. Однако, если я открою класс «Продукты» как частичный, не будет (насколько я могу судить) прямой ссылки от резервной копии продукта к классу DataContext, который его породил.

public partial class Product 
{
    public DataContext GetContext() 
    {
        return this.DataContext; 
        // FAILS!!! No connection from 'this' to DataContext
        // makes sense because "Product" isn't REALLY derived from DataContext
        //...but still, I want this to work!
    }
}

Но внутри класса частичного продукта я бы хотел иметь возможность напрямую запрашивать базу данных, и мне очень нравится иметь возможность инициализировать только один экземпляр DataContext и использовать его для моих запросов страницы aspx.cs, а также для запросов, выполняемых из разделяемых классов, вызываемых со страницы aspx.cs.

Итак, мое решение до сих пор состоит в том, чтобы передать экземпляр DataContext в качестве параметра 'ref' методам моего частичного класса, которые должны копаться в базе данных. Вот частичный класс:

public partial class Complaint
{
    public IEnumerable<Person> GetPByRole(InvestigationRole roleEnum, ref DataContext dbase)
    {
        var role = dbase.GetRole(roleEnum);
        return this.PeopleOnInvestigations
                   .Where(x => x.InvestigationRoleID == 1)
                   .Select(x => x.Person);
     }
}

Итак, есть ли обратная сторона в передаче моего объекта DataContext в качестве параметра ref любым методам частичного класса, которым требуется доступ к базе данных через это соединение? Одним из преимуществ является то, что после передачи объекта в качестве ref , я могу "AddObject()" новые сущности из этих частичных классов, и как только мой обратный вызов SaveChanges на моей странице asp.cs выполнен, ВСЕ изменения (из aspx и из методов частичного класса) выполняются.


  • Является ли DataContext структурой или классом? 09.03.2011
  • DataContext — это класс LINQ to SQL. Вы уверены, что используете Entity Framework? 09.03.2011
  • Да, EF4 в VS 2010. Под «DataContext» я имел в виду «большой объект, созданный EF из моей модели данных», то есть файл EDMX. 09.03.2011

Ответы:


1

Передача переменной ref используется для возможности изменения переменной, содержащей ссылку. Но поскольку вы не меняете ссылку DataContext dbase в методе GetPByRole, передавать ее как ref бесполезно и только запутает других разработчиков. Возможно, вы неправильно понимаете типы значений и ссылочные типы. Ссылочные типы (такие как DataContext) всегда передаются по ссылке, передача их через вызовы методов не создает новых копий самого объекта, а просто копирует ссылку (которая является либо 32-битным, либо 64-битным значением).

Вы смешиваете обязанности здесь. Ваш класс Product является сущностью, но вы, похоже, реализуете в нем все виды методов поиска данных. Очень скоро это станет большим беспорядком. Дайте каждому классу в вашей системе единственную ответственность. Ответственность класса Person - быть человеком.

Другими словами, то, что вы пытаетесь сделать, гораздо больше подходит для классов репозитория (или даже для классов обслуживания). Например, создайте PersonRepository, содержащий эти методы. PersonRepository сможет возвращать новые экземпляры Person (на самом деле репозиторий должен быть просто интерфейсом между вашим источником данных и вашим приложением и обычно не реализует методы запросов, связанные с бизнесом). Таким образом, вы освобождаете свои сущности от знания контекста данных (что является очень обдуманным дизайнерским решением команды ADO.NET при разработке Entity Framework).

09.03.2011
  • Все ваши очки верны. Буду ли я внутри класса PersonRepository инициализировать новый экземпляр DataContext для выполнения моих поисков, а затем избавляться от него? Меня беспокоило создание и удаление слишком большого количества объектов контекста данных для одного запроса страницы, и поэтому я хотел передать его, но действительно ли это беспокойство? 09.03.2011
  • Я бы не стал беспокоиться о создании слишком большого количества DataContext, что касается производительности. Это никогда не было проблемой для меня. Особенно когда это касается операций чтения. Однако из-за атомарности вам может потребоваться меньше DataContext экземпляров на запрос. Что я обычно делаю, так это оборачиваю свои репозитории в единицу работы и позволяю этой единице работы управлять файлом DataContext. Я отделяю операции запросов от бизнес-транзакций (операций CUD). Классы запросов определяют такие методы, как GetPByRole, и используют единицу работы и репозитории под ними: например, bit.ly/gAoDnO 09.03.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..