Вопрос

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

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

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

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

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

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

Кроме того, для использования функций базы данных нам необходимо использовать трехуровневую архитектуру.Могу ли я напрямую вызвать метод 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();
    }

}

Подходит ли указанная выше последовательность вызова метода?

Это было полезно?

Решение

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
}

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

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

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

Примечание.Это хорошая практика значения хэш-пароля в базе данных.

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

Другие советы

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

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

Это позволяет вам выполнять операции с базой данных над объектами, которые могли быть получены из двух разных объектов 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();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top