自动设置数据模型属性
Posted
技术标签:
【中文标题】自动设置数据模型属性【英文标题】:Auto setting a data model property 【发布时间】:2015-06-03 09:29:42 【问题描述】:我正在尝试根据类的同一实例中的两个其他属性值的组合来设置数据模型属性值。我希望它在类被实例化时自动工作。但是,如果我要使用构造函数来执行此操作,则此时不会设置任何其他模型属性。
然后,每当我尝试访问该属性时,都会返回 null
。任何有关如何处理这种情况的指导将不胜感激。
型号:
我正在尝试将VersionSchemeCode
设置为具有Version
和Scheme.SchemeCode
组合的值。但是,没有任何内容保存到数据库中。
public class SchemeVersion
private string _VersionSchemeCode;
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id get; set;
[Required]
public int Version get; set;
[Required]
public int SchemeId get; set;
[ForeignKey("SchemeId")]
public virtual Scheme Scheme get; set;
public string VersionSchemeCode
get
return _VersionSchemeCode;
set
using(var db = new MyDbContext())
var schemeCode = db.Schemes.SingleOrDefault(x => x.SchemeId == this.SchemeId).SchemeCode;
_VersionSchemeCode = String.Format("0_V1", schemeCode, this.Version.ToString());
【问题讨论】:
那个 setter 会让用户大吃一惊:它不使用分配的值。记住 .NET 指南:setter 看起来应该接近于设置底层字段,和应该很快。忽略分配的值并访问数据库肯定会错过。 【参考方案1】:只有几点:
如果 VersionSchemeCode
被计算(而不是持久化),您可以省略 getter,让 setter 根据其他属性值构建字符串。
或者,您可以为Version
和Scheme
使用常规属性(带有私有支持字段),并在设置它们时随时更新VersionSchemeCode
值。因此类似于以下内容...(但是,您需要注意,无论何时您的 Version
或 Scheme
属性发生更改,VersionSchemeCode
都会更新以反映这一点。)
private int _version;
[Required]
public int Version
get
return _version;
set;
_version = value;
VersionSchemeCode = String.Format("01", Version, Scheme.SchemeCode);
最后,我不太喜欢在我的 POCO 中包含数据访问代码。理想情况下,POCO 应该与数据库和 ORM 无关。我更希望有某种DataAccessService
和GetSchemeVersion
电话。这可以检索和水合您的实体,然后在返回之前调用一些函数来填充计算的属性。
public SchemeVersion GetSchemeVersion(int id)
using(var db = new MyDbContext())
var entity = db.SchemesVersions.SingleOrDefault(x => x.Id == id);
entity.SetCalculatedValues();
return entity;
【讨论】:
以上是关于自动设置数据模型属性的主要内容,如果未能解决你的问题,请参考以下文章