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