2017-04-25 129 views
3

我建立一個窗口服務,以從第三方API把所有的網絡和插入/更新這些網絡給我們的本地數據庫。這裏是我的實體:實體框架6同步表外源

public partial class Networks 
{ 

    public string networkID { get; set; } 

    public int organizationID { get; set; } 

    public string type { get; set; } 

    public string name { get; set; } 

    public string time_zone { get; set; } 

    public string tags { get; set; } 
} 

目前我通過API返回的所有網絡迭代,檢查ID是否存在,如果它檢查每一個領域,如果他們中的一個字段不匹配全部更新。

 public void SyncNetworks() 
    { 
     List<Networks> all_networks = APICaller.GetNetworkList(); 
     foreach(var network_from_api in all_networks) 
     { 
      var network_in_database = db.it_asset_meraki_networks.FirstOrDefault(
              n => n.network_id == network_from_api.network_id); 
      if (network_in_database == null) 
       db.it_asset_meraki_networks.Add(network_in_meraki); 
      else 
       CheckAndSyncNetworkFields(network_from_api, network_in_database); 
     } 
     db.SaveChanges(); 
    } 


     private void CheckAndSyncNetworkFields(Networks network_from_api, Networks network_in_database) 
    { 
     if(network_in_database.name != network_from_api.name 
      || network_in_database.organizationID != network_from_api.organizationID 
      || network_in_database.type != network_from_api.type 
      || network_in_database.tags != network_from_api.tags 
      || network_in_database.time_zone != network_from_api.time_zone) 
     { 
      network_in_database.name = network_from_api.name; 
      network_in_database.organizationID = network_from_api.organizationID; 
      network_in_database.type = network_from_api.type; 
      network_in_database.tags = network_from_api.tags; 
      network_in_database.time_zone = network_from_api.time_zone; 
     } 
    } 

有沒有更有效的方法呢?我能以某種方式使用IsModfied或Attach功能嗎?

回答

1

我認爲你只是在尋找在實體框架中的Upsert(插入或更新)。

您可以使用AddOrUpdate()對於這一點,看到here

.Added.Modified可以和使用,作爲第一個答案here

+0

所以AddOrUpdate()將能夠認識到,如果即使被傳遞並沒有從實體框架起源對象存在的網絡見過? (爲了快速響應而使用了btw) – pieAre5quare