现在需要定义一个类Consume,用于操作消费记录,其中需要使用客户和分店的部分信息,所以在里面加一个User类型,一个Shop类型的属性,
这种方式是否是良好的设计?因为从数据库读取数据的时候只会初始化User的部分字段,可能会导致User的部分方法失效。
public class Consume
{
/// <summary>
/// 消费单据编号
/// </summary>
public string ConsumeID { get; set; } /// <summary>
/// 店号
/// </summary>
public Shop ShopItem { get; set; } /// <summary>
/// 消费日期
/// 由存储过程生成
/// </summary>
public DateTime Date { get; set; }
/// <summary>
/// 单据类型
/// </summary>
public string DocumentType { get; set; }
/// <summary>
/// 客户
/// </summary>
public User ConsumeUser { get; set; }
}
这种方式是否是良好的设计?因为从数据库读取数据的时候只会初始化User的部分字段,可能会导致User的部分方法失效。
public class Consume
{
/// <summary>
/// 消费单据编号
/// </summary>
public string ConsumeID { get; set; } /// <summary>
/// 店号
/// </summary>
public Shop ShopItem { get; set; } /// <summary>
/// 消费日期
/// 由存储过程生成
/// </summary>
public DateTime Date { get; set; }
/// <summary>
/// 单据类型
/// </summary>
public string DocumentType { get; set; }
/// <summary>
/// 客户
/// </summary>
public User ConsumeUser { get; set; }
}
解决方案 »
- 无法加载 DLL“IDCard.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)
- 菜鸟紧急求助: 在DataGridView 里面删除一行数据,会影响到数据库里面的数据吗?
- 截取字符串
- ajax调用用户控件时,用户控件无法执行后台代码,如何解决?(加分贴)
- 如何在TextBox里面查找字符?
- 小女子跪求各位大哥哥一个小问题。关于DataGrid中设置某个单元格为下拉菜单,并且向这个下拉菜单添加两三条数据。
- C#和mysql可以进程B/S的开发吗
- 求助:关于DataGrid的问题!
- 解释一段Arcgis engine c#的代码
- 【【【为嘛这么坑爹?】】】
- 获取缓存行数 缓存是没问题的 问什么 会报错呢
- 型表达树使用匿名类型排序问题
你这个是db first思想。
现在提倡code first思想。
其实所谓“领域建模”我到现在都还没领会如何应用好。
在我的判断里,总感觉这反而会使代码不够简洁。也很有可能我是从数据库编程时代过来的人,觉得类似sql的语法是更简洁,更能体现业务逻辑的,我需要条理清晰的“知道”具体的业务逻辑,而不是“领域设计”层的整体逻辑,偏好这个。其实说到“脱离数据库进行对象设计”,EF是很好的例证。对于对象包含(即多表关联),它是通过“导航属性”实现的。所以EF应该是包含了“领域设计”概念的,也就是你现在考虑的这种设计模式。
那么有了导航属性,如果不能很好的支持它,是会造成开发效率下降的,所以EF对导航属性有很好的支持。你能通过它提供的一些方法,较好
的填充相关数据,更新相关表。所以可以说“EF较好的支持了领域设计”,是可以作为你探索的方向的。但对于我自己来说,我是在精读了《Entity Framework 6 Recipes 2nd Edition》之后,觉得不喜欢它这种实现,因为它:
1、仍有缺陷
2、对于不精通EF的程序员,用的不好的话,会降低访问数据库的性能(EF智能生成的sql不够好)
所以我抛弃了EF的导航属性,我直接用LINQ写多表关联,自己来把握SQL语句的性能。所以我仍然坚持我的观点,这也可以理解为一种设计偏好。再讲远一点,EF的导航属性设计的有点啰嗦和缺陷,其实还是因为它映射的是关系型数据库。如果你用的是非关系型数据库,比如NoSQL的话,那就可以实现完全的对象化设计或者说“领域设计”,因为它的存储就是完全按你对象设计来的。