Разумные способы использования TableAdapter с базовым классом, интерфейсом или частичным классом - PullRequest
2 голосов
/ 04 декабря 2009

C # ADO.Net Объекты TableAdapter не реализуют и не взаимодействуют ни с базовым классом (кроме Component).

Кто-нибудь использовал TableAdapter в шаблоне типа (GoF-)?

Обновление: Я хотел бы решить проблему, описанную здесь:
Помогите улучшить программу миграции
с помощью шаблона (GoF), адаптера (GoF) или других полезных шаблонов.

Ответы [ 2 ]

5 голосов
/ 04 декабря 2009

Адаптеры таблиц не имеют конкретного базового класса или интерфейса. Но парни из MS достаточно умны, чтобы оставить частичное. Таким образом, вы можете играть с TableAdapter с частичным классом. Мы столкнулись с подобной проблемой, когда хотели написать общий код, который может адресовать все адаптеры таблиц в модели данных. мы сделали это следующим образом.

1.) Определен интерфейс ITableAdapter

public interface ITableAdapter<TDataTable> : IDisposable
    where TDataTable : DataTable
{
    void AttachTransaction(SqlTransaction _transaction);
    SqlTransaction CreateTransaction();

    int Update(TDataTable _dataTable);

    TDataTable GetData();
    TDataTable GetById(int Id);
}

2.) Позже мы создали частичные классы для каждой таблицы-адаптера в проекте и реализовали этот интерфейс для них.

public partial class UsersTableAdapter : ITableAdapter<FileParkDataSet.UsersDataTable>
{
    #region ITableAdapter<UsersDataTable> Members

    public void AttachTransaction(SqlTransaction _transaction)
    {
        if (this.Adapter == null)
            this.InitAdapter();

        this.Adapter.InsertCommand.Transaction = _transaction;
        this.Adapter.UpdateCommand.Transaction = _transaction;
        this.Adapter.DeleteCommand.Transaction = _transaction;

        foreach (var _cmd in this.CommandCollection)
        {
            _cmd.Transaction = _transaction;
        }
    }

    public SqlTransaction CreateTransaction()
    {
        if (this.Connection.State != ConnectionState.Closed)
            this.Connection.Close();
        this.Connection.Open();

        return this.Connection.BeginTransaction();
    }

    #endregion
}

Теперь вы можете программировать на ITableAdapter.

1 голос
/ 04 декабря 2009

Как и большая часть BCL, поскольку у вас нет доступа к внутренним компонентам, вам необходимо определить собственную иерархию классов и сделать ссылки на классы BCL менее непосредственными.

Что-то вроде шаблона адаптера может удовлетворить ваши потребности: используйте его, чтобы "обернуть" TableAdapter во что-то, что вы затем сможете использовать в качестве шаблона.

...