我为支持泛型根据#liveDB的关系建模试验。这里有一个如何进展偷看。实体
E型实体存储在EntitySetlt; EGT,包装SortedSetlt; EGT,NET 4的新的集合类作为一个平衡二叉树实现。与O(log N)的读取和写入操作。实体需要订购内排序的集合,可以实现使用一个关键属性实现IComparable的或实体本身的执行IComparablelt;的EGT;。这里有三种不同的方式定义的键的一些例子实体:
类别实体有一个名为ID类型的属性IComparablelt; intgt;命名约定将用作键。 "User实体有物业与KeyAttribute标志着。任务实现IComparablelt; Taskgt,所以任务对象将被用作键,Id属性将被忽略。任务有一个外键属性的CategoryId, 但注意到实体没有任何出境的对象引用。一个实体可以是聚合的,但必须从一个孤立的其他实体,这意味着没有入站或出站的对象引用。例如,为了实体可以有OrderLine的对象的集合。
这种隔离是很重要的查询。想象之间的N对N的关系上述范畴和任务,其中的类别有anbsp收集任务和任务,具有分类收集。单个任务的查询可能返回数据库中的每个任务和分类!这是一个常见的错误初学者。通常情况下,我们处理这个问题返回特定视图引用剥离的对象。我们可以有实例TaskView类表示为一个字符串列表类别。该模型
接下来,创建一个模型和派生从RelationalModel,在构造函数中定义的实体集:{C}
不多怎么回事,真的。CRUD的命令和查询
现在开始你的引擎,你都设置为基本的CRUD类型的命令AddEntityCommandlt; EGT,RemoveEntityCommandlt; EGT;和ReplaceEntityCommandlt; EGT;当然,没有什么是停止您还创建自定义的命令。 EntitySetlt; EGT;实现IEnumerablelt; EGT;男,RGT;实例,因此通常使用lambda表达式或Querylt查询。
这里是AddEntityCommandlt; EGT在行动:
结论 1: [TestMethod()]
2: public void can_add_entity()
3: {
4: var engine = Engine.LoadOrCreate<MyRelationalModel>();
5:
6: //Create the entity you want to insert
7: var category = new Category{ Name = "Beverages"};
8:
9: //Create a generic command
10: var addCommand = new AddEntityCommand(category);
11:
12: //A copy is returned with the the Id assigned
13: category = engine.Execute(addCommand);
14: int numEntities = engine.Execute( db => db.SetOf<Category>().Count());
15: Assert.IsTrue(numEntities == 1);
16: engine.Close();
17: }
18:
19:
20: [TestMethod()]
21: public void added_entity_was_assigned_a_key()
22: {
23: var engine = Engine.LoadOrCreate<MyRelationalModel>();
24: var category = new Category { Name = "Beverages" };
25: var addCommand = new AddEntityCommand(category);
26: category = engine.Execute(addCommand);
27: Assert.IsTrue(category.Id > 0);
28: engine.Close();
29: }
OK,所以这是不是真正的关系,但它使基本的CRUD,你做你的正确建模。带有CRUD,你不必编写特定面向任务的命令,你可以从查询返回,而无需映射到参考剥离的视图对象实体。