Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动设置数据模型属性_C#_Entity Framework_Asp.net Mvc 4_Setter - Fatal编程技术网

C# 自动设置数据模型属性

C# 自动设置数据模型属性,c#,entity-framework,asp.net-mvc-4,setter,C#,Entity Framework,Asp.net Mvc 4,Setter,我试图基于类的同一实例中的两个其他属性值的组合来设置数据模型属性值。我希望在实例化类时自动执行此操作。然而,如果我使用一个构造函数来实现这一点,那么其他的模型属性都不会在这一点上被设置 然后,每当我尝试访问该属性时,都会返回null。如果您能就如何处理这种情况提供任何指导,我们将不胜感激 型号: 我试图将VersionSchemeCode设置为具有Version和Scheme.SchemeCode的组合值。但是,不会将任何内容保存到数据库中 public class SchemeVersion

我试图基于类的同一实例中的两个其他属性值的组合来设置数据模型属性值。我希望在实例化类时自动执行此操作。然而,如果我使用一个构造函数来实现这一点,那么其他的模型属性都不会在这一点上被设置

然后,每当我尝试访问该属性时,都会返回
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}_V{1}", schemeCode, this.Version.ToString());
            }
        }
    }          
}

只有几点:

如果计算了
VersionSchemeCode
(与持久化相反),您可以省略getter,让setter根据其他属性值构建字符串

或者,您可以对
Version
Scheme
使用常规属性(带有专用支持字段),并在设置
VersionSchemeCode
值时随时更新它们。所以像下面这样的事情。。。(但是,您需要意识到,每当您的
版本
方案
属性发生更改时,
版本方案代码
将更新以反映这一点。)

最后,我并不特别喜欢在我的POCO中包含数据访问代码。POCO最好是数据库和ORM不可知的。我更喜欢使用带有
GetSchemeVersion
调用的
DataAccessService
。这可以检索实体并将其水合物化,然后在返回之前调用一些函数来填充计算的属性

public SchemeVersion GetSchemeVersion(int id)
{
        using(var db = new MyDbContext())
        {
            var entity = db.SchemesVersions.SingleOrDefault(x => x.Id == id);
            entity.SetCalculatedValues();
            return entity;
        }         
}

该setter将让用户感到惊讶:它不使用所分配的值。请记住.NET准则:setter应该看起来接近于只设置一个底层字段,并且应该很快。忽略指定的值和访问数据库肯定会出错。
public SchemeVersion GetSchemeVersion(int id)
{
        using(var db = new MyDbContext())
        {
            var entity = db.SchemesVersions.SingleOrDefault(x => x.Id == id);
            entity.SetCalculatedValues();
            return entity;
        }         
}