C# 实体框架6与外部源同步表
我正在构建一个windows服务,从第三方API中提取所有网络,并将这些网络插入/更新到本地数据库。这是我的实体:C# 实体框架6与外部源同步表,c#,sql-server,entity-framework-6,C#,Sql Server,Entity Framework 6,我正在构建一个windows服务,从第三方API中提取所有网络,并将这些网络插入/更新到本地数据库。这是我的实体: public partial class Networks { public string networkID { get; set; } public int organizationID { get; set; } public string type { get; set; } public string name { get;
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;
}
}
public void SyncNetworks()
{
列出所有网络=APICaller.GetNetworkList();
foreach(所有网络中来自api的var网络)
{
数据库中的var网络=db.it\u资产\u meraki\u网络.FirstOrDefault(
n=>n.network\u id==network\u from\u api.network\u id);
if(网络\u在\u数据库中==null)
db.it_asset_meraki_networks.Add(network_in_meraki);
其他的
CheckAndSyncNetworkFields(api中的网络,数据库中的网络);
}
db.SaveChanges();
}
专用void CheckAndSyncNetworkFields(api中的网络,数据库中的网络)
{
if(network_in_database.name!=network_from_api.name
||数据库.organizationID!=api.organizationID中的网络
||\u database.type!中的网络\u=来自\u api.type的网络\u
||network_in_database.tags!=network_from_api.tags
||网络\u在\u数据库中。时区!=网络\u来自\u api。时区)
{
\u database.name中的network\u=来自\u api.name的network\u;
_database.organizationID中的network_=_api.organizationID中的network_;
_database.type中的network_=_api.type中的network_;
_database.tags中的network_=_api.tags中的network_;
\u database.time\u zone中的网络\u=来自\u api.time\u zone的网络\u;
}
}
有没有更有效的方法?我是否可以使用ismodified或Attach函数?我想您只是在实体框架中寻找一个Upsert(插入或更新) 为此,您可以使用
AddOrUpdate()
,请参阅
.Added
或Modified
也可以使用,如第一个答案所示,因此AddOrUpdate()将能够识别网络是否存在,即使传递的对象不是来自实体框架?(顺便说一句,快速响应需要ty)