Как заставить 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();
        }
    }
}
Другие вопросы по тегам