LINQ с 3 уровня - PullRequest
       27

LINQ с 3 уровня

2 голосов
/ 28 мая 2009

В настоящее время я работаю над дизайном моего дипломного проекта. Несколько дней назад я начал изучать LINQ. Я нашел это интересным и планировал использовать его в своем проекте, но теперь я в какой-то момент запутался.

Когда я добавляю класс LINQ to SQL, он автоматически генерирует классы сущностей для каждой таблицы в базе данных.

Предположим, у меня есть две таблицы в базе данных:

Пользователь
Проекты
UserProjects (объединенная таблица)

и объединенная таблица, представляющая, какой пользователь связан с каким проектом.

LINQ to SQL class автоматически генерирует эти три класса для меня. Теперь я должен создать отдельные классы (Пользователь и Проект) как Бизнес-объект или использовать эти автоматически созданные объекты?

Кроме того, для использования функциональности базы данных нам необходимо использовать трехуровневую архитектуру. Могу ли я напрямую вызвать метод LINQ DAL из моего BLL или мне нужно создать отдельный DAL, который будет вызывать метод LINQ DAL ??

class UserBLL

{
    public void saveUser(String username, String password)
    {
         // here I am calling LINQ DAL from by BLL
         UserDataContext db = new UserDataContext();
         User u =new User {Username = username, Password = password};
        db.user.InsertOnSubmit(u);
       db.SubmitChanges();
    }

}

Хорошо ли последовательность вызова метода выше?

Ответы [ 2 ]

5 голосов
/ 28 мая 2009

Linq To SQL отлично подходит для одноуровневого проектирования. Не так хорошо для отключенной модели или многоуровневой среды .

Приведенный выше код вставляет в базу данных только одного пользователя. Если вы запустите MSSQL SQL Server Profiler или подключите журнал к выходу в Visual Studio. Вы должны увидеть

//Hookup the log to the output in visual studio
using (var db = new UserDataContext()) {
    db.Log = Console.Out;
}

INSERT INTO User VALUES (value1, value2, value3,...)

Чтобы обновить пользователя, ваш код должен выглядеть примерно так:

public void UpdateUser(String username, String password, int userId)
{
     using (var db = new UserDataContext()) {
         //Get Row From Database Marching Id
         var user = db.user.Single(p => p.Id = userId);
         //Update Values
         user.Username = username;
         user.Password = password;
         //Save To The Database
         db.SubmitChanges();
     }
}

//Get All Users From Database
public IEnumerable<User> GetAllUsers()
{
     using (var db = new UserDataContext()) {
         //Get Row From Database Matching Id
         var users = from user in db.user
                    select user;
         return users.ToList();
     }
}

//To display the data just enumerate through the enumeration that is returned.
var users = BusinessInstance.GetAllUsers();
foreach (var user in users) {
    //user is the current item
}

Вы должны подписывать контракт с базой данных каждый раз, когда выполняете единицу работы. (поскольку контекст базы данных использует транзакцию по умолчанию, и это может показаться уродливым, не беспокойтесь о производительности при создании контекста базы данных! )

Обычно, когда вы работаете с многоуровневой средой, вы создаете отдельные POCO при их передаче по проводам (сети).

NCommon - отличная абстракция для Linq to Sql, должна обрабатывать бизнес-валидацию и правила.

Примечание. Рекомендуется использовать значения хеш-пароля в базе данных.

Посетите блог ScottGu, где вы сможете быстро получить ответы на вопросы и ознакомиться с основными вопросами linq

0 голосов
/ 28 мая 2009

Обычно я создаю текстовый контекст с областью действия для каждого из моих объектов BLL.

Я также создаю 2 конструктора: 1, который создает текстовый текст, и другой, который принимает текстовый текст. Во-вторых, я могу передавать текст данных из других объектов BLL.

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

Следует отметить, что объект DataContext не обязательно должен быть явно расположен, дополнительная информация здесь . Но в основном DataContext будет жить только в течение времени жизни объекта BLL. Вы можете явно утилизировать его, если вам действительно нужно освободить ресурсы (т. Е. Вы закончили отслеживать изменения).

, например

public class UserBLL
{
    private readonly UserDataContext context;

    public UserBLL() : this(new UserDataContext())
    {
    }

    public UserBLL(UserDataContext context)
    {
        this.context = context
    }

    public UserDataContext Context { get { return context; } }

    public void saveUser(String username, String password)
    {
         // here i am callsing LINQ DAL from by BLL
         User u = new User {Username = username, Password = password};
         Context.Users.InsertOnSubmit(u);
         Context.SubmitChanges();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...