一尘不染

EntityFramework,如果不存在则插入,否则更新

sql

我有一个实体集国家/地区,在我的数据库中反映了数据库表’<’char(2),char(3),nvarchar(50>)。

我有一个解析器,它返回一个已解析国家的Country
[]数组,并且在以正确的方式更新它时遇到了问题。我想要的是:以国家/地区为数组,为那些尚未在数据库中的国家/地区插入它们,以及那些现有的更新(如果有任何字段不同)。如何才能做到这一点?

void Method(object sender, DocumentLoadedEvent e)
{
    var data = e.ParsedData as Country[];
    using(var db = new DataContractEntities)
    {
       //Code missing


    }
}

我在想类似

for(var c in data.Except(db.Countries)) but it wount work as it compares on wronge fields.

希望任何人以前都有过此问题,并为我找到了解决方案。如果我不能使用Country对象并轻松地插入/更新它们的数组,那么我看不到使用框架的好处,因为从表演者的角度来看,我认为编写自定义sql脚本插入该对象的速度更快,而不是检查一个国家/地区插入之前已经在数据库中了吗?

解决方案

请参阅帖子的答案。

我在我的国家/地区类别中添加了覆盖等于:

    public partial class Country
{

    public override bool Equals(object obj)
    {
        if (obj is Country)
        {
            var country = obj as Country;
            return this.CountryTreeLetter.Equals(country.CountryTreeLetter);
        }
        return false;
    }
    public override int GetHashCode()
    {
        int hash = 13;
        hash = hash * 7 + (int)CountryTreeLetter[0];
        hash = hash * 7 + (int)CountryTreeLetter[1];
        hash = hash * 7 + (int)CountryTreeLetter[2];
        return hash;
    }
}

然后执行:

        var data = e.ParsedData as Country[];
        using (var db = new entities())
        {
            foreach (var item in data.Except(db.Countries))
            {
                db.AddToCountries(item); 
            }
            db.SaveChanges();
        }

阅读 114

收藏
2021-03-17

共1个答案

一尘不染

我会简单地做到这一点:

void Method(object sender, DocumentLoadedEvent e)
{
    var data = e.ParsedData as Country[];
    using(var db = new DataContractEntities)
    {
        foreach(var country in data)
        {
            var countryInDb = db.Countries
                .Where(c => c.Name == country.Name) // or whatever your key is
                .SingleOrDefault();
            if (countryInDb != null)
                db.Countries.ApplyCurrentValues(country);
            else
                db.Countries.AddObject(country);
        }
        db.SaveChanges();
     }
}

我不知道您的应用程序必须多久运行一次,或者您的世界有多少个国家。但是我有种感觉,您不必考虑复杂的性能优化。

编辑

仅发出一个查询的替代方法:

void Method(object sender, DocumentLoadedEvent e)
{
    var data = e.ParsedData as Country[];
    using(var db = new DataContractEntities)
    {
        var names = data.Select(c => c.Name);
        var countriesInDb = db.Countries
            .Where(c => names.Contains(c.Name))
            .ToList(); // single DB query
        foreach(var country in data)
        {
            var countryInDb = countriesInDb
                .SingleOrDefault(c => c.Name == country.Name); // runs in memory
            if (countryInDb != null)
                db.Countries.ApplyCurrentValues(country);
            else
                db.Countries.AddObject(country);
        }
        db.SaveChanges();
     }
}
2021-03-17