如何使用Code-First EntityFramework将ID保存为DB中的字符串

时间:2014-09-29 09:00:39

标签: entity-framework model ef-code-first

我有一个模特:

    public class Something
    {
        public int Id { set; get; }
        public string Name{ set; get; }
    }

我也有这个课程:

    public class SomethingConfiguration : EntityTypeConfiguration<Something>
    {
        public SomethingConfiguration()
        {
            HasKey(t => t.Id).Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        }
    }

一切正常,Id在插入数据库并保存更改(提交)后自动生成。

现在我想添加另一列IdStringId作为字符串而不是int),因此我可以将它用于按ID搜索操作(自动填充等)。如何添加IdString列,将自动标识为字符串,并在插入和保存时自动保存?有可能吗?

1 个答案:

答案 0 :(得分:1)

在Sql Server中,您可以使用基础公式定义计算列。

ALTER TABLE dbo.Something Add IsString  AS cast(Id as nvarchar)

可以像这样在你的模型中映射这些列。

public partial class Something
{
    public int Id { get; set; }

    public string IdString { get; set; }

    public string Name { get; set; }
}

this.Property(p => p.IdString)
    .HasMaxLength(30)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

然后在您的查询中使用。

var data1 = db.Something.Where(p => p.IdString.Contains("123"));

由于DatabaseGeneratedOption.Computed定义,每次更新行时,EntityFramework都会请求列的当前值。

但是如果你只想要一个整数值的ToString()的可翻译版本,你可以改用SqlFunctions.StringConvert。

var data = db.Something
                .Where(p => SqlFunctions.StringConvert((decimal)p.Id).Contains("12"));

<强>更新 使用迁移添加计算列。

public override void Up()
{
    CreateTable(
        "dbo.Something",
        c => new
            {
                Id = c.Int(nullable: false, identity: true),
                Name = c.String(nullable: false, maxLength: 255),
            })
        .PrimaryKey(t => t.Id);

    Sql("ALTER TABLE dbo.Something Add IsString  AS cast(Id as nvarchar)");
}

public override void Down()
{
    DropTable("dbo.Something");
}