标签: savechanges

在创建1000个Entity Framework对象时应该何时调用SaveChanges()?(比如导入时)

我正在运行一个导入,每次运行将有1000个记录.只是在我的假设上寻找一些确认:

以下哪一项最有意义:

  1. 运行SaveChanges()每个AddToClassName()电话.
  2. SaveChanges()nAddToClassName()呼叫运行一次.
  3. 运行SaveChanges()后,所有的的AddToClassName()电话.

第一种选择可能是慢的吗?因为它需要分析内存中的EF对象,生成SQL等.

我假设第二个选项是两个世界中最好的,因为我们可以围绕该SaveChanges()调用包装try catch ,并且如果其中一个失败,则一次只丢失n个记录.也许将每个批次存储在List <>中.如果SaveChanges()调用成功,请删除列表.如果失败,请记录项目.

最后一个选项可能最终也会非常慢,因为每个EF对象都必须在内存中才能SaveChanges()被调用.如果保存失败,则不会发生任何事情,对吧?

import performance loops entity-framework savechanges

73
推荐指数
3
解决办法
3万
查看次数

Fabric.js - 如何使用自定义属性在服务器上保存画布

我希望能够将当前画布的状态保存到服务器端数据库,可能作为JSON字符串,然后再将其恢复loadFromJSON.通常,使用以下方法可以轻松完成:

var canvas = new fabric.Canvas();
function saveCanvas() {
    // convert canvas to a json string
    var json = JSON.stringify( canvas.toJSON() );

    // save via xhr
    $.post('/save', { json : json }, function(resp){ 
        // do whatever ...
    }, 'json');
}
Run Code Online (Sandbox Code Playgroud)

然后

function loadCanvas(json) {

  // parse the data into the canvas
  canvas.loadFromJSON(json);

  // re-render the canvas
  canvas.renderAll();

  // optional
  canvas.calculateOffset();
}
Run Code Online (Sandbox Code Playgroud)

但是,我还使用内置Object#set方法在我添加到画布的结构对象上设置了一些自定义属性:

// get some item from the canvas
var item = canvas.item(0);

// add misc …
Run Code Online (Sandbox Code Playgroud)

database json savechanges fabricjs

51
推荐指数
3
解决办法
3万
查看次数

是否可以在调用DbContext.SaveChanges之前查询实体框架?

在这个简单的例子中,我有两个实体:Event和Address.我每晚都运行一个控制台应用程序来从XML源导入事件数据并将其添加到我的数据库中.

当我遍历XML事件节点(在Entity Framework上下文中)时,我检查是否有数据库中已存在给定值的地址记录.如果没有,它会添加一条新记录.

using (DemoContext context = new DemoContext())
{
    foreach (XmlNode eventNode in eventsXml.SelectNodes("/Events/Event"))
    {
        Event newEvent = new Event();

        newEvent.Title = **get from XML**

        Address address = context.Addresses.Where(a =>
            a.Title.Equals(title, StringComparison.OrdinalIgnoreCase) &&
            a.Address1.Equals(address1, StringComparison.OrdinalIgnoreCase) &&
            a.Address2.Equals(address2, StringComparison.OrdinalIgnoreCase) &&
            a.City.Equals(city, StringComparison.OrdinalIgnoreCase) &&
            a.State.Equals(state, StringComparison.OrdinalIgnoreCase) &&
            a.ZipCode.Equals(zipCode, StringComparison.OrdinalIgnoreCase)
        ).FirstOrDefault();

        if (address != null)
            newEvent.Location = address;
        else
        {
            newEvent.Location.Title = title;
            newEvent.Location.Address1 = address1;
            newEvent.Location.Address2 = address2;
            newEvent.Location.City = city;
            newEvent.Location.State = state;
            newEvent.Location.ZipCode = zipCode;
        }

        context.Events.Add(newEvent);
    }

    context.SaveChanges(); …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework savechanges dbcontext entity-framework-5

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

将TransactionScope与实体框架6一起使用

我无法理解的是,是否可以对上下文进行更改并在提交之前在同一事务中获取更改.

这就是我要找的:

using (var scope = new TransactionScope(TransactionScopeOption.Required)) 
{ 
    using (var context = new DbContext()) 
    { 
        //first I want to update an item in the context, not to the db
        Item thisItem = context.Items.First();
        thisItem.Name = "Update name";
        context.SaveChanges(); //Save change to this context

        //then I want to do a query on the updated item on the current context, not against the db
        Item thisUpdatedItem = context.Items.Where(a=>a.Name == "Update name").First();

        //do some more query
    } 

    //First here I want it …
Run Code Online (Sandbox Code Playgroud)

c# transactionscope savechanges dbcontext entity-framework-6

20
推荐指数
2
解决办法
3万
查看次数

如何取消用户的WPF TreeView点击?

我有一个带有Treeview控件的WPF应用程序.

当用户单击树上的节点时,页面上的其他TextBox,ComboBox等控件将填充适当的值.

然后,用户可以更改这些值,并通过单击"保存"按钮保存其更改.

但是,如果用户选择不同的Treeview节点而不保存其更改,我想显示警告并取消该选择的机会.

MessageBox:继续并放弃未保存的更改?确定/取消http://img522.imageshack.us/img522/2897/discardsj3.gif

XAML ...

<TreeView Name="TreeViewThings"
    ...
    TreeViewItem.Unselected="TreeViewThings_Unselected"
    TreeViewItem.Selected="TreeViewThings_Selected" >
Run Code Online (Sandbox Code Playgroud)

Visual Basic ......

Sub TreeViewThings_Unselected(ByVal sender As System.Object, _
                              ByVal e As System.Windows.RoutedEventArgs)
    Dim OldThing As Thing = DirectCast(e.OriginalSource.DataContext, Thing)
    If CancelDueToUnsavedChanges(OldThing) Then
        'put canceling code here
    End If
End Sub

Sub TreeViewThings_Selected(ByVal sender As System.Object, _
                            ByVal e As System.Windows.RoutedEventArgs)
    Dim NewThing As Thing = DirectCast(e.OriginalSource.DataContext, Thing)
    PopulateControlsFromThing(NewThing)
End Sub

如何取消这些取消选择/选择事件?


更新:我问过一个后续问题......
如何使用MessageBox确认正确处理PreviewMouseDown事件?

wpf treeview savechanges

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

覆盖Entity Framework 5 Code Code中的SaveChanges以复制旧旧库的行为

我们公司提供一套操作数据库中数据的各种应用程序.每个应用程序都有其特定的业务逻辑,但所有应用程序共享业务规则的公共子集.常见的东西包含在一堆用C++编写的遗留COM DLL中,它们使用"经典ADO"(它们通常调用存储过程,有时它们使用动态SQL).这些DLL中的大多数都具有基于XML的方法(更不用说基于专有格式的方法!)来创建,编辑,删除和检索对象,还有额外的操作,例如快速复制和转换许多实体的方法.

中间件DLL现在已经很老了,我们的应用程序开发人员需要一个新的面向对象(不是面向xml)的中间件,可以很容易地被C#应用程序使用.该公司的许多人都说我们应该忘记旧的范例,转而采用新的酷炫的东西,比如Entity Framework.他们对POCO的简单性很感兴趣,他们希望使用LINQ来检索数据(基于Xml的DLL查询方法不是那么容易使用,并且永远不会像LINQ那样灵活).

所以我正在尝试为简化场景创建一个模型(真实场景要复杂得多,在这里我只发布一个简化场景的简化子集!).我正在使用Visual Studio 2010,实体框架5代码优先,SQL Server 2008 R2.如果我犯了愚蠢的错误,请怜悯,我是Entity Framework的新手.由于我有许多不同的疑虑,我会将它们分别发布.这是第一个.传统的XML方法有这样的签名:

    bool Edit(string xmlstring, out string errorMessage)
Run Code Online (Sandbox Code Playgroud)

使用这样的格式:

<ORDER>
    <ID>234</ID>
    <NAME>SuperFastCar</NAME>
    <QUANTITY>3</QUANTITY>
    <LABEL>abc</LABEL>
</ORDER>
Run Code Online (Sandbox Code Playgroud)

Edit方法实现了以下业务逻辑:当Quantity更改时,必须对具有相同Label的所有Orders应用"自动缩放".例如,有三个订单:OrderA的数量= 3,标签= X.订单B的数量= 4,标签= X.订单C的数量= 5,标签= Y.我调用Edit方法为OrderA提供新的数量= 6,即我将OrderA的数量加倍.然后,根据业务逻辑,OrderB的数量必须自动加倍,并且必须变为8,因为OrderB和OrderA具有相同的标签.不得更改OrderC,因为它具有不同的标签.

我如何使用POCO类和实体框架复制它?这是一个问题,因为旧的Edit方法一次只能更改一个订单,而实体框架可以在调用SaveChanges时更改大量订单.此外,对SaveChanges的单次调用也可以创建新的订单.临时假设,仅适用于此测试:1)如果同时更改了许多订单数量,并且所有这些订单数量的比例因子都不相同,则不进行缩放; 2)新添加的订单即使具有相同的缩放订单标签也不会自动缩放.

我试图通过重写SaveChanges来实现它.

POCO课程:

using System;

namespace MockOrders
{
    public class Order
    {
        public Int64 Id { get; set; }
        public string Name { get; set; }
        public string Label { get; set; }
        public decimal Quantity { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

迁移文件(创建索引):

namespace MockOrders.Migrations
{
    using …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework savechanges code-first entity-framework-5

11
推荐指数
1
解决办法
5017
查看次数

不允许实体框架新事务,因为在会话中运行其他线程,多线程保存

我试着在DB上保存多线程processo的日志,但是我收到以下错误:不允许新事务,因为会话中还有其他线程在运行.

在每个胎面我都有这个功能:

 internal bool WriteTrace(IResult result, string message, byte type)
    {
        SPC_SENDING_TRACE trace = new SPC_SENDING_TRACE(
                        message,
                        Parent.currentLine.CD_LINE,
                        type,
                        Parent.currentUser.FULLNAME,
                        Parent.guid);
        Context.SPC_SENDING_TRACE.AddObject(trace);
        if (Context.SaveChanges(result) == false)
            return false;
        return true;

    }
Run Code Online (Sandbox Code Playgroud)

每个线程的Context都不同,但与DB的连接始终是相同的.

有没有办法解决这个问题?

谢谢Andrea

c# multithreading savechanges entity-framework-4

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

如何从Entity Framework 6中的Auditlog实体获取id

我知道那里有几个类似的帖子,但我找不到任何解决这个问题的方法.

我想在Entity Framework 6中添加,更改或删除实体(软删除)时添加(某种)AudioLog.我已经重写了SaveChanges,因为我只想为EntityStates添加,修改或删除的日志条目,我在第一次调用SaveChanges之前获取列表.问题是,因为我需要记录已执行的操作,我需要检查实体的EntityState.但是在调用SaveChanges之后,所有条目的EntityState都是Unchanged.

public override int SaveChanges()
{
    using (var scope = new TransactionScope())
    {
        var modifiedEntries = ChangeTracker.Entries()
            .Where(e => e.State == EntityState.Added || e.State == EntityState.Deleted || e.State == EntityState.Modified)
            .ToList();

        int changes = base.SaveChanges();
        foreach (var entry in modifiedEntries)
        {
            ApplyAuditLog(entry);
        }

        base.SaveChanges();
        scope.Complete();
        return changes;
    }
}

private void ApplyAuditLog(DbEntityEntry entry)
{
    ILog entity = entry.Entity as ILog;

    if (entity != null)
    {
        LogOperation operation;
        switch (entry.State)
        {
            case EntityState.Added:
                operation = LogOperation.CreateEntity;
                break;
            case …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework savechanges audit-logging entity-framework-6

10
推荐指数
1
解决办法
4733
查看次数

如何在Entity Framework中回滚事务

string[] usersToAdd = new string[] { "asd", "asdert", "gasdff6" };
using (Entities context = new Entities())
{
    foreach (string user in usersToAdd)
    {
        context.AddToUsers(new User { Name = user });
    }
    try
    {
        context.SaveChanges(); //Exception thrown: user 'gasdff6' already exist.
    }
    catch (Exception e)
    {
        //Roll back all changes including the two previous users.
    }
Run Code Online (Sandbox Code Playgroud)

或者这可能是自动完成的,这意味着如果发生错误,则会针对所有更改取消提交更改.是吗?

c# entity-framework transactions savechanges rollback

9
推荐指数
2
解决办法
3万
查看次数

实体框架查询仅添加但未保存的值

我在几年内使用Entity Framework,现在我遇到了一些问题.

我将一个实体添加到我的表中

Entities.dbContext.MyTable.Add(obj1);
Run Code Online (Sandbox Code Playgroud)

好的

然后,我想在MyTable上查询,比如

Entities.dbContext.MyTable.Where(.....)
Run Code Online (Sandbox Code Playgroud)

上面的代码将在db中查询我的MyTable.

还有一种方法可以在saveChanges之前查询刚刚添加的值吗?(obj1)怎么样?

UPDATE

我为什么需要这个?因为,对于我添加的每个新元素,我需要编辑上一个和下一个记录中的一些值(此表中有一个datetime字段)

UPDATE2

假设我必须添加很多对象,但只在添加最后一项后才调用saveChanges.每次添加新项目时,我都会读取其日期时间字段,并在数据库中搜索上一个和下一个记录.在这里,我编辑前一个和下一个记录的字段.现在,问题是:如果我插入另一个项目,例如,下一个项目是"Obj1",我必须找到并编辑它,但我找不到它,因为我没有保存我的更改.现在更清楚了吗?

c# sql entity-framework savechanges

9
推荐指数
1
解决办法
6895
查看次数