C# 实体框架6与外部源同步表

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;

我正在构建一个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; 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)