簡體   English   中英

如何將mongo bson數組映射到c#對象,然后使用實體框架保存在SQL中

[英]How to map mongo bson array to c# object , then save in SQL using Entity framework

我有一個具有以下結構的mongodb bson集合,憑據[]引起了問題,請您推薦一個解決方案。 我有設備類,並具有實體框架的導航屬性。 還設置了context,只是json數組引起了問題,因為它內部有字符串而不是文檔。 野牛證件

{
"_id" : ObjectId("592dbf1446dbac785d6556a5"),
"deviceName" : "Computer1",

"updated" : ISODate("2017-06-30T20:18:25.681Z"),
"credentials" : [ 
    "fa4bafad-51b0-494c-89d8-6154f23bf3af", 
    "3138ac95-b9e6-4dbe-9825-f109c0d47f67"
],

"lastActivity" : ISODate("2017-06-06T17:55:35.894Z"),
"clientVersion" : "2.14.0"

}

C#類

    public  class Device
{

    [Key]


    public string _id { get; set; }
    public string deviceName { get; set; }
    public DateTime? updated { get; set; }
    public  string clientVersion { get; set; }

    public  DateTime lastActivity { get; set; }
    public ICollection <Credentials> credentials { get; set; }


}



public class Credentials
{

    [Key]

    public Guid CredentialId { get; set; }

    public string credentials { get; set; }
    [ForeignKey("Device")]
    public string DeviceId { get; set; }
    public virtual Device Device { get; set; }


}

 using (var context = new GkDataContext())
        {

            var deviceCollection = await Db.GetCollection<Device>("Devices").Find(new BsonDocument()).ToListAsync();

            context.device.AddRange(deviceCollection);

            context.SaveChanges();


        }

好的,您的EF實體是在查看Mongo對象還是在查看SQL Server表記錄?

您的Mongo實體(或對象)將僅具有字符串集合。 我希望將非映射的GUID集合添加到解析Mongo對象的類中。 為了在SQL端處理對Credential表的實體引用,我希望對這些ID進行SelectMany,然后從SQL Server預加載Credential實體以提供匹配的引用,以添加到Device的SQL實例中。

public class MongoDevice
{
   ...
   public ICollection<string> Credentials{ get; set; }

   [NotMapped]
   public ReadOnlyCollection<Guid> CredentialIds
   {  // Can be optimized, but requires coding to keep in sync with operations against Credentials...
      get{ return Credentials.Select(x=> Guid.Parse(x)).ToList().AsReadOnly(); }
   }
 }

public class Device 
{
   ...
   public virtual List<Credential> Credentials{ get; set; }
}

您可能一直在考慮擁有一個可以在Mongo和SQL之間切換的實體? 我不認為這很實用,因為在SQL中需要憑據的對象/表引用中,Mongo不提供這些引用。

加載Mongo實體並收集憑據ID之后...

// If you have a lot of devices / credentials, break this up into several iterations. You don't want to end up with a huge IN clause below.
List<Guid> credentialIds = mongoDevices.SelectMany(x=> x.CredentialIds).ToList();
List<Credential> credentials = sqlDbContext.Credentials.Where(x=> credentialIds.Contains(x.CredentialId)).ToList();

現在,當您將Mongo Device轉換為SQL記錄Device ...時,上面的提示是,由於EF無法知道CredentialIds是什么,因此mongoDevices必須此時是內存中的集合。 它只是一個幫助器屬性,可幫助您解析到Guid。

這可以通過多種方式完成,您可以遍歷每個設備(Mongo)並在SQL中加載/創建對應的對象,然后檢查憑據ID以確保每個憑據都被考慮到,或者可以在假設的情況下一次全部處理應該記錄所有記錄。 上面的“憑據”集合將引用帶有一批ID的SQL中的所有憑據記錄,這些記錄是一次性獲取到SQL Server的,而不是按需檢索記錄。 如果預計這將是巨大的記錄數,則可以分成幾批,或者從每個記錄按需開始,然后從那里開始工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM