Как заставить Linq2Sql работать с моими моделями
Я работаю над проектом, где мы использовали SqlConnection
, SqlCommand
и простой SQL для доступа к хранилищу. Сейчас я пытаюсь перейти на Linq2Sql и хочу использовать те же модели. Как мне этого добиться?
Я сведу структуру проекта к минимально значимому примеру.
Допустим, у меня есть следующие классы:
namespace Model
{
public class User
{
public int Id { get; set; }
}
}
Все модели в Model
Пространство имен - это единая копия сущностей базы данных.
namespace Repository
{
public class UserRepository
{
private _sqlConnectionHelper = new SqlConnectionHelper();
public User GetUser()
{
var reader = _sqlConnectionHelper
.ExecuteAndReturnReader("SELECT * FROM [dbo].[Users]");
while (reader.Read())
{
return new User
{
Id = (int)reader["Id"]
};
}
return null;
}
}
}
Сейчас я пытаюсь перейти на Linq2Sql. Я создал MyContext.dmbl
файл с User
стол в Repository
проект. Он сгенерировал следующий класс:
namespace Repository
{
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Users")]
[global::System.Runtime.Serialization.DataContractAttribute()]
public partial class User: INotifyPropertyChanging, INotifyPropertyChanged
{
private int _ID;
public int ID
{
get
{
return this._ID;
}
set
{
if ((this._ID != value))
{
this.OnIDChanging(value);
this.SendPropertyChanging();
this._ID = value;
this.SendPropertyChanged("ID");
this.OnIDChanged();
}
}
}
// Some other methods
}
}
Теперь проблема в том, что у меня много сущностей, репозиториев, моделей и т. Д. Я не хочу менять весь проект, чтобы использовать новые сгенерированные модели, но не мою из Model
Пространство имен. Как я могу сделать Linq2Sql
работать с моими моделями?
Это также влияет на мою архитектуру, потому что в случае этих моделей сущность и хранилище - это один и тот же объект. Мне не нужны мои сущности, чтобы быть объектами CRUD. Я просто хочу внести минимальные изменения в проект и использовать только удобные запросы LINQ вместо простого SQL, например:
namespace Repository
{
public class UserRepository
{
private MyContextDataContext _myContext = new MyContextDataContext();
public User GetUser()
{
return _myContext.Users.FirstOrDefault();
}
}
}
Или я просто не понимаю что-то о цели и логике Linq2Sql
а это как работает только как?
Конечно, я могу написать конвертеры или использовать отражение и сделать копию объекта свойство за свойством, но это не похоже на хорошее решение.
1 ответ
Хорошо. Наконец, я нашел ответ, который довольно прост - Linq2Sql
это не библиотека, которую я искал.
Существуют различные подходы для объектно-реляционного отображения: сначала код, сначалабаза данных, сначаламодель.
Вот хорошая статья Stackru об их различиях.
Теперь, когда я узнал об этом, то, что я описал в своем вопросе, можно было легко перефразировать как "как я могу сделать Linq2Sql первым в коде". Ответ прост - я не могу этого сделать.
В результате некоторых исследований я понял, что искал Entity Framework, который идеально подходит для моего проекта.
Теперь мой репозиторий выглядит так:
namespace Repository
{
public MyContextDataContext : DbContext
{
public DbSet<User> Users { get; set; }
}
public class UserRepository
{
private MyContextDataContext _myContext = new MyContextDataContext();
public User GetUser()
{
return _myContext.Users.FirstOrDefault();
}
}
}