将自定义实体映射到数据库列

本文关键字:数据库 映射 自定义 实体 | 更新日期: 2023-09-27 18:20:36

我想为我的主实体维护一个版本号(例如1.1、1.3、2.15等)。我不能使用十进制来存储版本,因为我必须存储1.1,如果我使用十进制,它将被存储为1.100。因此,我计划创建一个小的版本控制器类,该类处理版本号,并根据需要返回主/次/完整编号,并希望将其映射到数据库中的varchar列。

示例:

public class Item
{
    public Guid Id {get;set;}
    public string Name {get;set;}
    **// I want to map this property with the varchar column in the database**
    public Version Version {get;set;}
}
public class Version
{
    public string FullVersion {get;set;}
    public string Major {get;set;}
    public string Minor {get;set;}
    public void IncrementMinor()
    { // some logic }
    public void IncrementMajor()
    { // some logic }
    public override string ToString()
    {
        return FullVersion;
    }
}

有什么建议吗?

将自定义实体映射到数据库列

如果不将Version定义为实体(即在上下文中声明数据库集),则默认情况下它将存储为复杂类型。所以,如果您要存储Item实体,您将在数据库中看到以下字段:

 Id
 Name
 Version_FullVersion
 Version_Major
 Version_Minor

您所需要做的就是将主要和次要属性标记为未映射,并为完整版本属性提供一个漂亮的名称:

public class Version
{
    [Column("Version")]
    public string FullVersion 
    {
        get { return String.Format("{0}.{1}", Major, Minor); }
        set
        {
            var parts = value.Split('.');
            Major = parts[0];
            Minor = parts[1];
        }
    }
    [NotMapped]
    public string Major { get; set; }
    [NotMapped]
    public string Minor { get; set; }
    // ...
}

这正好生成三列:

 Id
 Name
 Version

顺便说一下,主要和次要版本字段考虑使用整数类型。


另一个选项-使您的版本属性不映射,并添加属性以存储字符串版本值:

public class Item
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    [NotMapped]
    public Version Version { get; set; }
    [Column("Version")]
    public string VersionValue
    {
        get { return Version != null ? Version.ToString() : null; }
        set { Version = Version.Parse(value); }
    }
}

并将Parse方法添加到Version类中(它将从版本字符串创建版本实例)。