2017-06-29 254 views
3

我使用.NET Core創建了一個可重用的庫(針對.NETStandard 1.4),我使用的是Entity Framework Core(以及兩者都是新的)。我有一個看起來好像是實體類:如何將JSON存儲在EF Core的實體字段中?

public class Campaign 
{ 
    [Key] 
    public Guid Id { get; set; } 

    [Required] 
    [MaxLength(50)] 
    public string Name { get; set; } 

    public JObject ExtendedData { get; set; } 
} 

,我必須定義一個DbSet類的DbContext:

public DbSet<Campaign> Campaigns { get; set; } 

(我也是用與DI Repository模式,但我不認爲,這是相關的)

我的單元測試給我這個錯誤:

System.InvalidOperationException: Unable to determine the relationship represented by navigation property 'JToken.Parent' of type 'JContainer'. Either manually configure the relationship, or ignore this property from the model..

有沒有辦法來IND這是不是一種關係,但應該存儲爲一個大字符串?

+0

我想你應該改變擴展數據類型爲字符串,然後存儲字符串JSON – Michael

+0

@邁克爾我想過但我想確保它總是有效的JSON。 – Alex

回答

7

@邁克爾的回答讓我正軌,但我實現它有點不同。我最終將該值作爲字符串存儲在私有屬性中,並將其用作「備份字段」。然後ExtendedData財產上被轉換JObject爲一個字符串的集合,反之亦然:

public class Campaign 
{ 
    // https://docs.microsoft.com/en-us/ef/core/modeling/backing-field 
    private string _extendedData; 

    [Key] 
    public Guid Id { get; set; } 

    [Required] 
    [MaxLength(50)] 
    public string Name { get; set; } 

    [NotMapped] 
    public JObject ExtendedData 
    { 
     get 
     { 
      return JsonConvert.DeserializeObject<JObject>(string.IsNullOrEmpty(_extendedData) ? "{}" : _extendedData); 
     } 
     set 
     { 
      _extendedData = value.ToString(); 
     } 
    } 
} 

要設置_extendedData爲後盾領域,我已將此添加到我的上下文:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Campaign>() 
     .Property<string>("ExtendedDataStr") 
     .HasField("_extendedData"); 
} 
+0

這也可能是一個選項。這兩種方法都在EF核心文檔中。支持領域看起來更清潔,但可能不那麼容易理解:) – Michael

+0

他們都是正確的做法。唯一的區別是,由於EF核心支持陰影屬性,因此後臺方法將利用陰影屬性並避免在域模型中擁有額外的屬性。 :) – Smit

2

你能試試這樣的事嗎?

[NotMapped] 
    private JObject extraData; 

    [NotMapped] 
    public JObject ExtraData 
    { 
     get { return extraData; } 
     set { extraData = value; } 
    } 

    [Column("ExtraData")] 
    public string ExtraDataStr 
    { 
     get 
     { 
      return this.extraData.ToString(); 
     } 
     set 
     { 
      this.extraData = JsonConvert.DeserializeObject<JObject>(value); 
     } 
    } 

這裏是遷移輸出:

ExtraData = table.Column<string>(nullable: true), 
+0

我認爲這是正確的方向 - 看起來像我可以使用「Backing Fields」來完成此操作(https://docs.microsoft.com/en-us/ef/core/modeling/backing-field)。 – Alex

相關問題