要疯了,开发中这么常见的有关问题没办法解决吗
要疯了,开发中这么常见的问题没办法解决吗?
下层对象如何访问上层对象的属性啊?
比如有一个订单对象(A),订单对象下面有订单项(B),如何在订单项对象中访问订单对象的属性?
class Order
{
OrderID
List<OrderList> OrderLists;
}
class OrderList
{
在这如何访问order对象中的 orderID 属性?
}
------解决思路----------------------
class OrderList
{
OrderID
}
------解决思路----------------------
class Order
{
OrderID
List<OrderList> OrderLists;
}
class OrderList
{
OrderID
在这如何访问order对象中的 orderID 属性?
}
OrderList里面也要有一个OrderID,以对应Order中的OrderID,数据库中这两个表就是一个主外键关系,查询订单的时候Order根据自己的OrderID查询OrderList中相同OrderID的数据,同样OrderList也通过自己的数据行中的OrderID查询Order的数据。
------解决思路----------------------
你说的和entity framework一样。
------解决思路----------------------
查询的时候就是这样:
------解决思路----------------------
在new OrderList的时候把OrderID当作参数传过去。
------解决思路----------------------
order对象总要有个方式能访问到吧?
你不想放在orderlist里,那就放别的地方啊,比如建个ordermanager,统一保存所有的order
或者order本身是个单例,那就好办了,用类似Order.Instance这样来获取
或者在orderlist里所有要用到order的方法里都加上order的参数
------解决思路----------------------
class Order
{
OrderID
List<OrderList> OrderLists;
}
class OrderList
{
在这如何访问order对象中的 orderID 属性?
public Order Order;
}
这样即可,典型的主从表,实现用ef很好实现
------解决思路----------------------
如果你觉得上面的办法别扭 那就。。。。
来个麻烦的
------解决思路----------------------
当你把一个 Order 放入数据库的时候,由于关系数据库根本不懂什么面向对象,它就是个离散的二维表,因此你的DAL程序需要把 Order对象放入Order,然后把OrderList(实际上应该叫 OrderItem) 放入 OrderItem表,这个时候你的 DAL 程序自然就要为 OrderItem 表中的 OrderID 赋值。
面向对象数据结构跟数据库是两回事。数据库表顶多只是对象结构的一种“映射”,DAL负责这个映射。因此你的 OrderList 不需要有 OrderID 属性。
当然如果你满脑子只有关系数据库概念,那么也不妨为你的 OrderList类型加上一个冗余的 OrderID 属性。显然这是增加了这个值错误时的麻烦的,但是谁让你只关心 DBFirst,而不以对象为优先呢?
下层对象如何访问上层对象的属性啊?
比如有一个订单对象(A),订单对象下面有订单项(B),如何在订单项对象中访问订单对象的属性?
class Order
{
OrderID
List<OrderList> OrderLists;
}
class OrderList
{
在这如何访问order对象中的 orderID 属性?
}
------解决思路----------------------
class OrderList
{
OrderID
}
------解决思路----------------------
class Order
{
OrderID
List<OrderList> OrderLists;
}
class OrderList
{
OrderID
在这如何访问order对象中的 orderID 属性?
}
OrderList里面也要有一个OrderID,以对应Order中的OrderID,数据库中这两个表就是一个主外键关系,查询订单的时候Order根据自己的OrderID查询OrderList中相同OrderID的数据,同样OrderList也通过自己的数据行中的OrderID查询Order的数据。
------解决思路----------------------
你说的和entity framework一样。
public partial class WX_User
{
public WX_User()
{
}
public int id { get; set; }
public string userName { get; set; }
public string userPwd { get; set; }
//就是这句话
public virtual ICollection<WX_UserAddress> WX_UserAddress { get; set; }
}
public partial class WX_UserAddress
{
public WX_UserAddress()
{
}
public int id { get; set; }
public Nullable<int> uid { get; set; }
//还有这句话
public virtual WX_User WX_User { get; set; }
}
------解决思路----------------------
查询的时候就是这样:
List<Order> list = 订单表.GroupJoin(订单明细表,a=>a.ID,b=>b.OrderID,(a,b)=>new Order{
OrderID = a.ID,
OrderLists = b.ToList()
}).ToList();
------解决思路----------------------
在new OrderList的时候把OrderID当作参数传过去。
------解决思路----------------------
order对象总要有个方式能访问到吧?
你不想放在orderlist里,那就放别的地方啊,比如建个ordermanager,统一保存所有的order
或者order本身是个单例,那就好办了,用类似Order.Instance这样来获取
或者在orderlist里所有要用到order的方法里都加上order的参数
------解决思路----------------------
class Order
{
OrderID
List<OrderList> OrderLists;
}
class OrderList
{
在这如何访问order对象中的 orderID 属性?
public Order Order;
}
这样即可,典型的主从表,实现用ef很好实现
------解决思路----------------------
如果你觉得上面的办法别扭 那就。。。。
来个麻烦的
//自己定义一个OrderList集合 而不是用 List<OrderList>
class OrderListCollection : IList,ICollection,IEnumerable{
private int count;
public int Count { get { return count; } }
private OrderList[] m_strOrderList;//一般都是用数组实现List
private Order owner;
public OrderListCollection(Order owner) { this.owner = owner; }
public void Add(OrderList orderList) {//实现Add 接口
if (orderList == null)
throw new ArgumentNullException("orderList cannot be null");
this.EnsureSpace(1);//确认存储空间
orderList.Parent = owner;//这样 OrderList 就有了 一个 Parent AddRange接口中也要
m_strOrderList[this.count++] = subItem;
}
//实现其他接口 AddRange IndexOf .. 等
//确认存储空间
private void EnsureSpace(int elements) {//elements 为需要增长个数
if (m_strOrderList == null)
m_strOrderList = new OrderList[Math.Max(elements, 4)];
else if (elements + this.count > m_strOrderList.Length) {
OrderList[] arrTemp = new OrderList[Math.Max(m_strOrderList.Length * 2, elements + this.count)];
m_strOrderList.CopyTo(arrTemp, 0);
m_strOrderList = arrTemp;
}
}
}
class Order{
//其他属性
//...
private OrderListCollection _OrderLists;
public OrderListCollection OrderLists{//自定义的集合
get{
if(_OrderLists == null) _OrderLists = new OrderListCollection(this);
return _OrderLists;
}
}
}
class OrderList{
private Order _Parent;
public Order Parent{get;set;}
//其他属性
//...
}
//使用的时候
new Order().OrderLists.Add(orderList) 的时候 orderList.Parent自动设置为了 Order
------解决思路----------------------
当你把一个 Order 放入数据库的时候,由于关系数据库根本不懂什么面向对象,它就是个离散的二维表,因此你的DAL程序需要把 Order对象放入Order,然后把OrderList(实际上应该叫 OrderItem) 放入 OrderItem表,这个时候你的 DAL 程序自然就要为 OrderItem 表中的 OrderID 赋值。
面向对象数据结构跟数据库是两回事。数据库表顶多只是对象结构的一种“映射”,DAL负责这个映射。因此你的 OrderList 不需要有 OrderID 属性。
当然如果你满脑子只有关系数据库概念,那么也不妨为你的 OrderList类型加上一个冗余的 OrderID 属性。显然这是增加了这个值错误时的麻烦的,但是谁让你只关心 DBFirst,而不以对象为优先呢?