2009-05-28 3 views
2

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

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

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

Пользователь
Проекты
UserProjects (совместный стол)

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

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

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

} 

Является ли вышеуказанный способ вызывая последовательность штрафа?

ответ

5

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,...) 

Чтобы обновить пользователь код должен смотреть на Somthing как

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, должна обрабатывать проверку и правила ведения бизнеса.

Примечание. Его хорошая практика - hash password values в базе данных.

Заканчивать ScottGu's blog for a quick q&a and basics on linq

+0

Я хочу получить список всех пользователей с помощью метода в моем классе UserBLL как я могу это сделать? – Mohsan

+0

обновленный контент –

+0

Вот как вы это делаете. НЕ с переменной экземпляра контекста данных. Хорошая работа Илия. – mmcdole

0

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

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

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

Следует отметить, что объект DataContext не должен быть явно расположен, more info here. Но в основном 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(); 
    } 
} 
+0

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

Смежные вопросы