IList <Item>Коллекция класса доступа к базе данных - PullRequest
0 голосов
/ 23 марта 2010

У меня есть база данных с пользователями. У пользователей есть Предметы.

Эти предметы могут активно меняться. Как получить доступ к элементам в формате типа коллекции? Для пользователя я заполняю все пользовательские свойства во время создания экземпляра. Если я загружаю элементы пользователя во время создания экземпляра, и элементы меняются, у них будут старые данные.

Я подумал, может быть, мне нужен класс ItemCollection и иметь это поле / свойство отдельно от класса пользователя, чтобы таким образом проходить все элементы пользователя, которые я мог бы использовать цикл foreach.

Итак, мой вопрос: каков наилучший метод / лучший способ доступа к элементам из базы данных, используя какую-то коллекцию? При доступе к конкретному элементу необходимо получить самую последнюю информацию о базе данных, а когда пользователь выполняет цикл foreach, должна быть доступна последняя информация об элементе.

т.е. Что я пытаюсь сделать

Console.WriteLine(User.Items[3].ID); returns 5.
//this updates the item information and saves it to the database.
User.Items[3].ID = 13; 

//Add a new item to the database.
User.Items.Add(new Item { id = 17});

foreach (Item item in User.Items) {
    //this would traverse all items in the database.
    //not some cached copy at the time of instantiation of the user.
}

Редактировать: Извините, я немного неправильно написал этот вопрос. В настоящее время я использую Linq, но у меня есть сопоставление классов с бизнес-объектами. Когда я делаю обход бизнес-объекта, я хотел бы, чтобы он пошел к текстовому тексту Linq и получил информацию.

Когда я реализую новый класс "ItemCollection", который реализует интерфейс IList, Что мне нужно сделать, чтобы вернуть его?

С помощью User.Items [3] реализуется в публичном Item этот метод [int index]. Должен ли метод index использовать оператор linq.Skip для получения индекса элемента в базе данных?

Я просто немного озадачен отображением коллекций бизнес-объектов в базу данных.

Ответы [ 4 ]

1 голос
/ 23 марта 2010

Хотя это и возможно, для этого потребуются некоторые необычные требования.

Прежде всего, это приведет к чрезмерному объему трафика между вашей базой данных и вашим приложением. Во-вторых, в параллельной среде это приведет к большому количеству условий гонки.

Просто для краткого примера, сегмент кода:

User.Items[3].ID = 13; 
User.Items[3].Color = Color.Blue; 

Может создавать состояния, которые не разрешены, однако они существуют в базе данных, по крайней мере, на мгновение из-за желания сохранить состояние. Кроме того, приведенный выше фрагмент кода дважды обращается к базе данных, чтобы выполнить простое обновление. И там гораздо сложнее гарантировать, что это изменение будет атомарным.

0 голосов
/ 23 марта 2010

Вам необходимо внедрить IList в свои классы базы данных, а также записывать в базу данных всякий раз, когда свойство изменяется.

Наличие доступа к данным через IList может быть хорошим в некоторых ситуациях, но автоматическая запись в базу данных, когда кто-либо изменяет свойство, создаст неприятные ситуации, когда кто-то изменит 20 свойств в экземпляре.

Когда речь идет о наилучшем способе доступа к данным в стиле коллекции, посмотрите на LiNQ.

0 голосов
/ 23 марта 2010

Требуется инструмент Object-Relational Mapping .

Я использую и рекомендую ADO.Net Entity Framework .

Большинство ORM содержат слой кэширования. И это в значительной степени то, что вы начинаете писать.

Большим преимуществом является то, что тот слой кэширования, который вы сейчас разрабатываете, создан для вас и, скорее всего, превзойдет вашу (или мою) реализацию.

Специально для Entity Framework основным компонентом, который вступает в игру, является компонент " Object Services "

Стек компонентов Entity Framework http://upload.wikimedia.org/wikipedia/en/b/b7/ANEF.PNG

Из " Сохранение изменений и управление параллелизмом " ...

Object Services отслеживает изменения, которые были сделаны для объектов в кэш. Когда метод SaveChanges Object Object Services пытается объединить возвращается к источнику данных. SaveChanges может потерпеть неудачу с OptimisticConcurrencyException, когда изменения данных в кеше объектов конфликт с изменениями, которые были сделаны в источнике данных после того, как объекты были добавлен или обновлен в кеше.

Так что это ручка в основном для вас за кулисами. А по мере роста набора сущностей вам не нужно изменять слой кэширования объектов, поскольку все это сделано для вас.

0 голосов
/ 23 марта 2010

Вы проверяли LINQ to SQL или Entity Framework?

Они оба обеспечивают схожую функциональность с тем, что вам нужно:

// Get first user with Id of 5
var users = _dbContext.Users.FirstOrDefault(u => u.Id == 5);

// Loop through all users in the context
foreach(var user in _dbContext.Users)
{
    foreach(var item in user.Items)
    {
        // Work with your item here.
    }
}

Вам просто нужно убедиться, что вы управляете контекстами, чтобы иметь самую свежую информацию.

...