EF架构~充血模型设置不被持久化的属性
在Poco实体中,一般只有属性没有方法,这在软件设计中称为贫血模型,而在DDD领域驱动设计中,比较提倡充血模型,即你的Poco实体中,即有属性,也有操作属性的方法,注意这里说的是操作属性的方法,你的具体业务方法不要写在这里!
而在实际项目中,我们可以有这样的需求,一个注册用户业务,它有密码和确认密码,这个确认密码不需要存储到数据表里,即不需要被持久化,这时,我们想到的就是为它加NonSerialized特性,而在使用过程中我们发现,这个特性只针对字段而言,而我们的实体中推荐使用属性的方式,所以我们需要寻找其它解决方案。
而对于 System.ComponentModel.DataAnnotations.Schema命名空间来说,确实有一个更好的特性适合我们的需求,这个就是NotMapped特性,从它的注释中可以看出,它主要功能就是从数据库映射中移除它,即数据表中不体现这个属性,现在我们代码代码修改一下,使用NotMapped实现的实体模型:
/// <summary> /// 用户实体模式 /// </summary> public class UserInfo : Entity { /// <summary> /// maxLength和stringLength都可以用来设置数据表字段的长度,stringLength不可以用来做MVC验证 /// </summary> [DisplayName("用户名"), Required, StringLength(50, MinimumLength = 6, ErrorMessage = "用户名只能由6~50个字符组成")] public string UserName { get; set; } [DisplayName("真实姓名"), Required, StringLength(30, MinimumLength = 6, ErrorMessage = "真实姓名只能由6~30个字符组成")] public string RealName { get; set; } public UserExtension UserExtension { get; set; } public List<OrderInfo> OrderInfo { get; set; } [DisplayName("密码"), StringLength(20, MinimumLength = 8, ErrorMessage = "密码由8~20个字符组成")] public string Password { get; set; } [DisplayName("确认密码"), NotMapped] public virtual string TruePassword { get; set; } #region 充血模型的方法 /// <summary> /// 生成MD5密码 /// </summary> /// <returns></returns> public string Md5Password() { return Lind.DDD.Commons.Encryptor.Utility.EncryptString(Password, Commons.Encryptor.Utility.EncryptorType.MD5); } /// <summary> /// 密码和确认密码的比较 /// </summary> /// <returns></returns> public bool Password_TruePassword() { return this.Password.Equals(this.TruePassword, StringComparison.CurrentCulture); } #endregion }
运行程序后,我们在数据表UserInfo中没有找到TruePassword这个字段,这说明NotMapped已经帮我们实现了我们想要的功能!
通过上面的代码,我们也看到了在DDD领域驱动里充血模型的实现,需要注意的地方就是什么样的方法应该写在模型里,什么样的方法应该写在业务层。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2014-10-23 知方可补不足~数据库名称和数据库别名不同了怎么办
2014-10-23 WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递
2014-10-23 WebApi系列~通过HttpClient来调用Web Api接口
2012-10-23 编译器错误~写JS还是谨慎点好
2012-10-23 编译器错误~不能向ObjectStateManager添加相同的键
2012-10-23 编译器错误~System.Data.Objects.DataClasses.EntityObject在未被引用的程序集中定义