2014-09-29 27 views
2

我有一個模型:如何在DB ID保存爲字符串代碼優先的EntityFramework

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列將自動ID作爲字符串,並將插入和保存時自動保存?可能嗎?

+0

是什麼讓你覺得你不能用整數列來搜索,自動補齊等? – DavidG 2014-09-29 09:05:37

+0

我不能做Id.contains(queryString),因爲它是一個int。我可以做Id.toString()。contains(queryString),但爲此,我必須使用「.ToList()」int linq查詢,並且我想繼續使用「IQuariable」查詢,而不是列表(用於性能)。 – TamarG 2014-09-29 09:19:38

回答

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"); 
} 
+0

我使用代碼優先,所以我根本不寫SQL ... – TamarG 2014-09-29 11:10:25

+0

是的,但是你的DB必須以某種方式生成。你使用遷移嗎? – codeworx 2014-09-29 11:13:13

+0

還沒有。這是一個新項目。我可以刪除數據庫並使用種子功能創建一個新數據庫。我在哪裏寫第一行? – TamarG 2014-09-29 11:15:00

相關問題