Как создать методы CRUD для универсального объекта доступа к данным (DAO) с помощью LINQ to SQL - PullRequest
11 голосов
/ 07 января 2012

Я новичок в LINQ to SQL и пытаюсь создать универсальный объект доступа к данным (DAO) для базовых методов Create, Read, Update и Destroy (CRUD), чтобы я мог повторно использовать код. Мне удалось создать универсальный метод, который будет удалять любую сущность с помощью приведенного ниже кода, но мне было интересно, знает ли кто-нибудь, как создать универсальный метод, который будет выбирать любую сущность с помощью общего поля Id, которое существует во всех таблицах.

    /// <summary>
    /// Generic method that deletes an entity of any type using LINQ
    /// </summary>
    /// <param name="entity"></param>
    /// <returns>bool indicating whether or not operation was successful</returns>
    public bool deleteEntity(Object entity)
    {
        try
        {
            DomainClassesDataContext db = new DomainClassesDataContext();
            db.GetTable(entity.GetType()).Attach(entity);
            db.GetTable(entity.GetType()).DeleteOnSubmit(entity);
            db.SubmitChanges();
            return true;
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.StackTrace);
            return false;
        }
    }

Я почти уверен, что тот же самый шаблон будет работать для обновления и вставки, и хотел бы иметь универсальный метод в GenericDAO, который будет извлекать мне любую сущность (например, Customer, Invoice, WorkOrder и т. Д.) На основе Id. Заранее спасибо за ответы.

1 Ответ

18 голосов
/ 07 января 2012

Я думаю, что вы ищете Шаблон репозитория , его простая реализация представлена ​​ниже:

Сначала вам нужно создать интерфейс IRepository, например:

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Delete(T entity);
    void Update(T entity);
    IEnumerable<T> All();
    ...
}

Затем:

public class Repository<T> : IRepository<T>
    where T : class, IEntity
{
    DataContext _db;
    public Repository()
    {
        _db = new DataContext("Database string connection");
        _db.DeferredLoadingEnabled = false;
    }
    public void Add(T entity)
    {
        if (!Exists(entity))
            GetTable.InsertOnSubmit(entity);
        else
            Update(entity);
        SaveAll();
    }
    public void Delete(T entity)
    {
        GetTable.DeleteOnSubmit(entity);
        SaveAll();
    }
    public void Update(T entity)
    {
        GetTable.Attach(entity, true);
        SaveAll();
    }
    System.Data.Linq.Table<T> GetTable
    {
        get { return _db.GetTable<T>(); }
    }
    public IEnumerable<T> All()
    {
        return GetTable;
    }
}

Затем:

public class CustomerRepository : Repository<Customer>
{
    public ProductRepository()
        : base()
    {
    }
}

Тогда вы можете получить что-то вроде:

Customer newCustomer = new Customer { FistName = "Foo", LastName = "Boo" };
_customerRepository.Add(newCustomer);

Где Customer - это сущностьсопоставлены с вашей базой данных, которая определена в .dbml.Это только начало, см. Следующие подробности:

...