我有一个有用户的数据库。用户有物品。
这些项目可以积极改变。如何访问集合类型格式的项?对于用户,我在实例化时填充所有的用户属性。如果我在实例化时加载用户的项,并且项发生了更改,它们将有旧的数据。
我在想,也许我需要一个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,但是我有将类映射到业务对象的方法。当我对业务对象进行遍历时,我希望它转到Linq数据文本并获取信息。
当我实现一个实现接口ItemCollection的新类“IList”时,我需要做什么来获得它返回的项?
使用User.Items3,是在公共项下实现的这个索引方法。索引方法是否应该使用linq.Skip操作符来获取数据库中项的索引?
我只是对将业务对象集合映射到数据库感到有点困惑。
发布于 2010-03-23 14:31:40
虽然这是可以做到的,但也需要一些不寻常的要求。
首先,这将在数据库和应用程序之间产生过多的通信量。第二,在并发环境中,这将引入大量的竞赛条件。
仅举一个简单的例子,代码段:
User.Items[3].ID = 13; 
User.Items[3].Color = Color.Blue; 可以生成不允许的状态,但是由于渴望持久化状态,它至少在数据库中存在一段时间。此外,上面的代码段将访问数据库两次,以便进行简单的更新。在那里,要保证这一变化是原子性的要困难得多。
发布于 2010-03-23 14:23:58
您签出LINQ或实体框架了吗?
它们都提供了与您所需的功能类似的功能:
// 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.
    }
}您只需确保您管理您的上下文,以便您有最新的信息。
发布于 2010-03-23 14:24:30
您需要在数据库类中实现IList,并在属性更改时写入数据库。
在某些情况下,拥有IList对数据的访问可能是很好的,但是每当有人更改属性时,自动写入数据库就会造成不愉快的情况,当某人更改实例上的20个属性时。
当谈到以类似集合的方式访问数据的最佳方法时,请查看LiNQ。
https://stackoverflow.com/questions/2500605
复制相似问题