C# IList<;项目>;集合类访问数据库

C# IList<;项目>;集合类访问数据库,c#,database,caching,collections,class-design,C#,Database,Caching,Collections,Class Design,我有一个用户数据库。 用户拥有项目 这些项目可以主动更改。 如何访问集合类型格式的项目? 对于用户,我在实例化时填充所有用户属性。 如果我在实例化时加载了用户的项,并且这些项发生了变化, 他们将拥有旧数据 我在想,也许我需要一个ItemCollection类,在user类之外有一个字段/属性,这样可以遍历所有用户的项,我可以使用foreach循环 那么,我的问题是,使用某种集合从数据库访问项目的最佳实践/最佳方式是什么?在访问特定项时,它需要获取最新的数据库信息,并且当用户执行foreach循环

我有一个用户数据库。 用户拥有项目

这些项目可以主动更改。 如何访问集合类型格式的项目? 对于用户,我在实例化时填充所有用户属性。 如果我在实例化时加载了用户的项,并且这些项发生了变化, 他们将拥有旧数据

我在想,也许我需要一个ItemCollection类,在user类之外有一个字段/属性,这样可以遍历所有用户的项,我可以使用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,但我有映射到业务对象的类。 当我对业务对象执行遍历时,我希望它转到LINQDataContext并获取信息

当我实现一个新类“ItemCollection”时,它实现了接口IList, 我需要做什么才能让它退货

对于User.Items[3],在公共项[int index]方法中实现。 index方法是否应该使用linq.Skip操作符来获取数据库中项目的索引


我只是对将业务对象集合映射到数据库有点困惑。

您是否签出了LINQ到SQL或实体框架

它们都提供了与您所需类似的功能:

// 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.
    }
}

您只需确保管理上下文,以便获得最新信息。

您需要在数据库类中实现IList,并在更改属性时写入数据库

在某些情况下,具有IList对数据的访问权限可能是很好的,但当有人更改某个属性时自动写入数据库会在有人更改实例上的20个属性时造成不愉快的情况

当谈到以类似集合的方式访问数据的最佳方式时,请查看LiNQ。

您需要一个工具

我使用并推荐

大多数orm都包含一个缓存层。这就是你开始写的东西

一个很大的好处是,您现在设计的缓存层是为您构建的,并且很可能比您(或我的)实现的性能更好

特别是对于实体框架,发挥作用的主要组件是“”组件


(来源:)

从“

对象服务跟踪 已对中的对象进行了修改 隐藏物当SaveChanges方法为 调用时,对象服务尝试合并 更改回数据源。 SaveChanges可能会因错误而失败 乐观并发异常 对象缓存中的数据更改 与所做的更改发生冲突 在创建对象之后在数据源中 添加到缓存或在缓存中刷新


所以这主要是在幕后为你处理的。随着实体集的增长,您不必修改对象缓存层,因为这一切都是为您完成的。

虽然这是可能的,但需要一些特殊的要求

首先,这将在数据库和应用程序之间产生过多的通信量。其次,在并发环境中,这将引入大量竞争条件

举个简单的例子,代码段:

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

可能会产生不允许的状态,但由于渴望持久化状态,它在数据库中至少存在一段时间。此外,上面的代码段将访问数据库两次,以便进行简单的更新。在这里,要保证这种更改是原子性的要困难得多。

您使用的是实体框架吗?没有,但我使用的是Linq to SQL+1-确切地说,通常您只需在迭代之前重新加载用户及其项。