小编Jam*_*mes的帖子

如何强制实体框架不要锁定数据库

可能重复:
使用NOLOCK的实体框架

我正在使用EF4和.Net 4将一些XML从文件加载到数据库中.

我有一个包围ObjectContext的类,并且有一些方法可以将XML文件中的编组对象添加到代表我的表的各种EntityCollections中.

每个XML文件平均包含大约200,000个对象,包装类在构造时创建ObjectContext并将引用存储在本地私有类变量中,然后由方法使用.

当我完成创建我打电话的实体时:

entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
Run Code Online (Sandbox Code Playgroud)

这将在服务器上创建一个事务,该事务按照EntityFramework设计.但是,即使在未添加到的表上,此事务也完全锁定了我的数据库.

我尝试了各种各样的事情来解决这个问题,包括在TransactionScope中包装保存更改,如下所示:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress,
       new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
       {
            entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

            transaction.Complete();
       }
Run Code Online (Sandbox Code Playgroud)

我还尝试在创建ObjectContext之前创建TransactionScope,以试图影响在SaveChanges期间使用的基础事务.

理想情况下,我希望一次加载多个文件,但如果在保存更改期间锁定了DB,则无法进行此操作.

有谁知道解决这个问题的方法?有没有强制EntityFramework不使用事务?

在此先感谢您的帮助.

詹姆士

entity-framework transactions

13
推荐指数
1
解决办法
2万
查看次数

将SQLGeography多边形重新格式化为JSON

我正在构建一个以JSON格式提供地理边界数据的Web服务.

地理数据使用表中的地理类型存储在SQL Server 2008 R2数据库中.我使用[ColumnName].ToString()方法将多边形数据作为文本返回.

示例输出:

POLYGON ((-6.1646509904325884 56.435153006374627, ... -6.1606079906751 56.4338050060666))

MULTIPOLYGON (((-6.1646509904325884 56.435153006374627 0 0, ... -6.1606079906751 56.4338050060666 0 0)))
Run Code Online (Sandbox Code Playgroud)

地理定义可以采用定义多边形的纬度/长度对数组的形式,或者在多个定义的情况下,采用数组或多边形(多边形).

我有以下正则表达式,根据输出将输出转换为多维数组中包含的JSON对象.

Regex latlngMatch = new Regex(@"(-?[0-9]{1}\.\d*)\s(\d{2}.\d*)(?:\s0\s0,?)?", RegexOptions.Compiled);

    private string ConvertPolysToJson(string polysIn)
    {
        return this.latlngMatch.Replace(polysIn.Remove(0, polysIn.IndexOf("(")) // remove POLYGON or MULTIPOLYGON
                                               .Replace("(", "[")  // convert to JSON array syntax
                                               .Replace(")", "]"), // same as above
                                               "{lng:$1,lat:$2},"); // reformat lat/lng pairs to JSON objects
    }
Run Code Online (Sandbox Code Playgroud)

这实际上工作得很好,并且在响应操作调用时动态地将DB输出转换为JSON.

然而,我不是正则表达式大师,而且String.Replace()对我来说效率似乎也低效.

有没有人对此表现有任何建议/意见?

c# json geojson sqlgeography wkt

8
推荐指数
3
解决办法
7087
查看次数

比较两个实体框架实体的最佳方法是什么?

我想知道比较两个相同类型实体的最有效方法.

一个实体是手工创建的xml文件(即新实例和手动设置属性),另一个实体是从我的对象上下文中重新创建的.

我想知道每个实例中的属性值是否相同.

我的第一个想法是从每个对象生成属性值的哈希并比较哈希,但可能有另一种方式,或内置方式?

欢迎大家提出意见.

非常感谢,

詹姆士

UPDATE

我想出了这个:

static class ObjectComparator<T>
{
    static bool CompareProperties(T newObject, T oldObject)
    {
        if (newObject.GetType().GetProperties().Length != oldObject.GetType().GetProperties().Length)
        {
            return false;
        }
        else
        {
            var oldProperties = oldObject.GetType().GetProperties();

            foreach (PropertyInfo newProperty in newObject.GetType().GetProperties())
            {
                try
                {
                    PropertyInfo oldProperty = oldProperties.Single<PropertyInfo>(pi => pi.Name == newProperty.Name);

                    if (newProperty.GetValue(newObject, null) != oldProperty.GetValue(oldObject, null))
                    {
                        return false;
                    }
                }
                catch
                {
                    return false;
                }
            }

            return true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我还没有对它进行测试,从集团中产生更多的想法更能让人深思.

可能存在问题的一件事是比较具有实体值本身的属性,如果默认比较器在对象引用上进行比较,那么它将永远不会成立.可能的解决方法是重载我的实体上的相等运算符,以便它在实体ID上进行比较.

comparison entity-framework

7
推荐指数
1
解决办法
1万
查看次数

如何在C#中编写实体比较器(带有首次尝试的示例代码)

可能重复:
比较两个实体框架实体的最佳方法是什么?

我想知道比较两个相同类型实体的最有效方法。

一个实体是通过xml文件手动创建的(即,新实例和手动设置的属性),而另一个则是从我的对象上下文中删除的。

我想知道每个实例中的属性值是否相同。

我的第一个想法是从每个对象生成属性值的哈希值并比较哈希值,但是可能有另一种方法还是内置方法?

欢迎大家提出意见。

非常感谢,

詹姆士

更新

我想出了这个:

static class ObjectComparator<T>
{
    static bool CompareProperties(T newObject, T oldObject)
    {
        if (newObject.GetType().GetProperties().Length != oldObject.GetType().GetProperties().Length)
        {
            return false;
        }
        else
        {
            var oldProperties = oldObject.GetType().GetProperties();

            foreach (PropertyInfo newProperty in newObject.GetType().GetProperties())
            {
                try
                {
                    PropertyInfo oldProperty = oldProperties.Single<PropertyInfo>(pi => pi.Name == newProperty.Name);

                    if (newProperty.GetValue(newObject, null) != oldProperty.GetValue(oldObject, null))
                    {
                        return false;
                    }
                }
                catch
                {
                    return false;
                }
            }

            return true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我还没有测试过,它更是一种思想,可以从小组中产生更多的想法。

可能存在问题的一件事是比较本身具有实体值的属性,如果默认比较器根据对象引用进行比较,那么它将永远不会成立。一种可能的解决方法是使相等运算符重载到我的实体上,以便对实体ID进行比较。

.net c# comparison performance entity-framework

4
推荐指数
1
解决办法
1万
查看次数