我有一个模特:
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
在插入数据库并保存更改(提交)后自动生成。
现在我想添加另一列IdString
(Id
作为字符串而不是int),因此我可以将它用于按ID搜索操作(自动填充等)。如何添加IdString
列,将自动标识为字符串,并在插入和保存时自动保存?有可能吗?
答案 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");
}