小编Jon*_*ith的帖子

实体框架:由于ObjectStateManager,使用ExecuteSqlCommand清除表会导致异常

我使用EF5 Code First,需要一种快速清理表格的方法.因此我制作了一个非常简单的方法来使用ExecuteSqlCommand来提供快速表清除.代码如下:

    public void FastClearTable(Type tableType)
    {
        Context.Database.ExecuteSqlCommand(
            string.Format("delete from {0}", PluraliseTableName(tableType.Name)));
    }
Run Code Online (Sandbox Code Playgroud)

我在重新计算之前使用它来清除表格.下面我列出了我的方法的简化版本.请注意,表的键是一个字符串(即不是标识键),因此我使用与ExecuteSqlCommand删除的条目相同的键放入新条目.

public int ComputeNewTableContent( IRepository<MyClass> rep, IUnitOfWork uow)
{
     if ( rep.GetUntracked().Count() > 0)
           uow.FastClearTable( typeof(MyClass));

     --- compute new entries and call rep.Insert( newEntry) for each one ---
     uow.Commit();    //This calls DbContext.SaveChanges()
}
Run Code Online (Sandbox Code Playgroud)

这在第一次工作正常,但如果我再次运行它,我会在SaveChanges()命令上得到一个异常,该命令由uow.Commit()调用.例外是:

Message ="调用目标抛出了异常."

InnerException Message ="对数据库的更改已成功提交,但更新对象上下文时发生错误.ObjectContext可能处于不一致状态.内部异常消息:AcceptChanges无法继续,因为对象的键值与另一个对象冲突ObjectStateManager.在调用AcceptChanges之前,确保键值是唯一的."

如果发现这个存档的MSDN 帖子,并且在底部该人有同样的问题,但没有答案.我的观点是数据的内存版本仍然存在,并且不知道ExecuteSqlCommand.但是我还不了解EF还知道如何解决它.

我当然可以通过使用"正常"删除来绕过它,但我希望有人解释发生了什么以及我如何处理它.这将提高我对实体框架的了解.

提前致谢.

entity-framework ef-code-first

5
推荐指数
1
解决办法
4897
查看次数

实体框架中的ValidateEntity未在删除条目时调用

我有一个复杂的类(参见下面的示例代码),我保存在Entity Framework Code First数据库(V5)中.问题是如果在保存到数据库的FooAndOrBar数据中使用FooClass我想要阻止FooClass条目被删除.因为它可能为null,所以外键检查不会阻止FooClass被删除,所以我必须检查自己.

    class FooClass { ... some properties }

    class BarClass { ... some properties }

    class FooAndOrBar
    {
        public int Id { get; set; }
        public FooClass Foo { get; set; }
        public BarClass Bar { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

因此,遵循验证跨越多个数据库条目的条目的良好实践,我向Entity Framework的ValidateEntity方法添加了一个测试,如下所示.

    protected override DbEntityValidationResult ValidateEntity(
        DbEntityEntry entityEntry, IDictionary<object, object> items)
    {
        if (entityEntry.Entity is FooClass && 
            entityEntry.State == EntityState.Delete)
        {               
            if (... entityEntry.Entity is used in DbContext.FooAndOrBars ...)
                return new DbEntityValidationResult(... error ...);
        }

        return base.ValidateEntity(entityEntry, …
Run Code Online (Sandbox Code Playgroud)

.net entity-framework ef-code-first

5
推荐指数
1
解决办法
1459
查看次数

如何在PDFSharp中使用私有字体

我试图使用私有文本添加文本到PDF文档,即没有安装在系统上,TrueType字体和麻烦.我正在使用NuGet的PDFSharp + MigraDoc WPF版本1.32.2608.0.

我在论坛和StackOverFlow上找到了很多项目.最新的是这篇stackoverflow文章,它引用了PdfSharp网站上的这个例子.但是,此示例包含以下代码:

this.fontFamilies.Add(key, fontFamily);
Run Code Online (Sandbox Code Playgroud)

在第22行,但我在汇编中找不到任何对fontFamilies的引用.

因此,我遵循了一个看起来很好的例子,但它对我不起作用.当我使用这种方法时,我可以成功添加字体但是当我来使用命令时:

var font = new XFont(fontStyle.Name, new XUnit(fontStyle.SizePt, XGraphicsUnit.Point), XFontStyle.Regular, _fontOptions);
Run Code Online (Sandbox Code Playgroud)

fontStyle.Name前面没有#的字体名称在哪里?此时,PdfSharp private void Initialise()在PdfSharp.Drawing命名空间内的方法内部中断.

此时检查Initialise方法内的变量它具有:

  1. 找到了字体系列,即 this.family != null
  2. 找到了字体,即 this.typeface != null

我假设它在线上突破if (!typeface2.TryGetGlyphTypeface(out typeface))但我无法确定.

注意:我已经尝试过.ttf和.otf字体无济于事.

有人能指出我正确的方向吗?

更新

最后我换成了PDFSharp WPF 1.50 beta,因为它的字体处理要好得多.请参阅我在第二期的SO帖子以及解决我的问题的新字体解析器的信息.现在一切都运转良好.

c# wpf fonts pdfsharp

4
推荐指数
2
解决办法
8422
查看次数

Autofac - 混合InstancePerHttpRequest和异步范围

我正在构建一个以MVC3为主要前端的四层系统,但包含由服务层异步运行并报告进度的长期运行任务,MVV将使用Ajax显示.我正在使用Autofac进行依赖注入(DI)主要是因为接口和文档很好并且因为它很快(参见Philip Mateescu 关于DI速度的这项优秀研究).

我的问题是如何设置Autofac来处理注入项的两个范围,即MVC3依赖项必须是PerHttpRequest,但异步任务依赖项需要是InstancePerLifetimeScope.

显然,服务层需要使用单独的DI来解决长时间运行的任务的依赖关系.这样做的最佳方式是什么?

scope autofac asp.net-mvc-3

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