自动设置数据模型属性

Posted

技术标签:

【中文标题】自动设置数据模型属性【英文标题】:Auto setting a data model property 【发布时间】:2015-06-03 09:29:42 【问题描述】:

我正在尝试根据类的同一实例中的两个其他属性值的组合来设置数据模型属性值。我希望它在类被实例化时自动工作。但是,如果我要使用构造函数来执行此操作,则此时不会设置任何其他模型属性。

然后,每当我尝试访问该属性时,都会返回 null。任何有关如何处理这种情况的指导将不胜感激。

型号:

我正在尝试将VersionSchemeCode 设置为具有VersionScheme.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 根据其他属性值构建字符串。

或者,您可以为VersionScheme 使用常规属性(带有私有支持字段),并在设置它们时随时更新VersionSchemeCode 值。因此类似于以下内容...(但是,您需要注意,无论何时您的 VersionScheme 属性发生更改,VersionSchemeCode 都会更新以反映这一点。)

private int _version;

[Required]
public int Version 
 
   get 
    
      return _version; 
   
   set; 
    
      _version = value; 
      VersionSchemeCode = String.Format("01", Version, Scheme.SchemeCode);
   

最后,我不太喜欢在我的 POCO 中包含数据访问代码。理想情况下,POCO 应该与数据库和 ORM 无关。我更希望有某种DataAccessServiceGetSchemeVersion 电话。这可以检索和水合您的实体,然后在返回之前调用一些函数来填充计算的属性。

public SchemeVersion GetSchemeVersion(int id)

        using(var db = new MyDbContext())
        
            var entity = db.SchemesVersions.SingleOrDefault(x => x.Id == id);
            entity.SetCalculatedValues();
            return entity;
                 

【讨论】:

以上是关于自动设置数据模型属性的主要内容,如果未能解决你的问题,请参考以下文章

ThinkPHP6.0 模型创建方法

Django框架:模型 定义属性

Core Data 自动迁移不会在我的新模型中创建新实体

django 模型-----定义模型

19 01 18 dango 模型

核心数据模型设置