Tag: entity framework 6

使用GraphDiff更新多对多关联

我有以下数据模型: 我的业务逻辑适用于分离的实体,所以我使用GraphDiff来执行更新。 我在更新PerfModes / CalcPoints关联时遇到问题。 从概念上讲,Block拥有CalcPoints和PerfModes,但CalcPoints可以与任意数量的PerfModes相关联。 我正在尝试在Block级别进行更新。 我提出的代码不会抛出任何错误(而其他尝试也会),但它也不会更新PerfModes / CalcPoints关联。 container.UpdateGraph(block, map => map .OwnedCollection(b => b.HistPoints) .OwnedCollection(b => b.CalcPoints) .OwnedCollection(b => b.PerfModes, with => with .OwnedCollection(p => p.FilterCriterion, with2 => with2 .OwnedCollection(fc => fc.Filters, with3 => with3 .AssociatedEntity(f => f.OperatorType) .AssociatedEntity(f => f.CalcPoint)))) .AssociatedCollection(p => p.CalcPoints) ); 我可能没有完全掌握EF图和GraphDiff。 如何确保多对多PerfModes / CalcPoints关联正确更新? 编辑 在查看了andyp的答案后,我从GitHub中下载了最新版本的GraphDiff并尝试了以下映射: container.UpdateGraph(block, […]

使用EF6无法保存数据。 错误:OriginalValues不能用于处于已添加状态的实体

我对entity framework很陌生。 作为了解更多关于EF的入门者,我试图按照http://genericunitofworkandrepositories.codeplex.com/的示例制作EF6的通用实现。 当我开始创建项目时,我尝试使用相同的实体保存数据,同时尝试简单实现。 但是,现在我在尝试保存数据时出错了。 错误: OriginalValues’(($ ReturnValue1))。OriginalValues’抛出类型’System.InvalidOperationException’的exceptionSystem.Data.Entity.Infrastructure.DbPropertyValues {System.InvalidOperationException} 消息是:OriginalValues不能用于处于已添加状态的实体。 堆栈跟踪: at System.Data.Entity.Internal.InternalEntityEntry.ValidateStateToGetValues(String method, EntityState invalidState) at System.Data.Entity.Internal.InternalEntityEntry.get_OriginalValues() at System.Data.Entity.Infrastructure.DbEntityEntry`1.get_OriginalValues() 我在github上有它。 任何人都可以帮我解决这个问题吗? 我从昨天开始被困在这里:)。 我在堆栈溢出时看到类似的post。 但是,他们遇到的问题就像传递空值,其中没有空值可以在db中接受。 在我的情况下,这不是问题。 请检查我的存储库并建议我能做什么..任何帮助表示赞赏。 这是lib链接: https : //github.com/tazbir/TryLib 编辑: 错误的地方在这里: public void SyncObjectState(TEntity entity) where TEntity : class, IObjectState { Entry(entity).State = StateHelper.ConvertState(entity.ObjectState);(执行此行后触发错误) } public class StateHelper { public static EntityState ConvertState(ObjectState […]

entity framework级联删除 – FOREIGN KEY约束

我有以下型号的问题: public class ProjectPage { [Key] public Guid Id { get; set; } public Guid? HeaderId { get; set; } public ProjectPage Header { get; set; } public Guid? FooterId { get; set; } public ProjectPage Footer { get; set; } } 在模型创建我有这个: modelBuilder.Entity().HasOptional(p => p.Header).WithMany().HasForeignKey(p => p.HeaderId).WillCascadeOnDelete(true); modelBuilder.Entity().HasOptional(p => p.Footer).WithMany().HasForeignKey(p => p.FooterId).WillCascadeOnDelete(true); 但我无法更新数据库。 我在Package […]

entity framework,数据库优先,未创建类文件

我有一个从MS SQL数据库创建的非常复杂的EF模型。 (我正在使用EF 6.1.0。)我在数据库中添加了一个表,并执行了“从数据库更新模型”。 不幸的是,出现了一些问题,虽然在.edmx文件中生成了大量的XML(如XML编辑器所示),但表格及其关系(所有这些都是正确和完整的,我能说的最好),没有生成类声明。 当我查看.tt文件是针对模型中所有表的.tt文件时,此类没有.cs文件。 由于该类已经在.edmx文件中,因此我无法重复“从数据库更新模型”。 我过去以这种方式为模型添加了许多表格,我看不出这个表格有什么不同。 以下是我尝试过的一些事情: 搜索网络,但没有发现任何相关的东西。 大多数文章都是关于使用“从数据库更新模型”的教程。 这是一个例子: 在EF Database First项目中更新模型 使用XML编辑器从.edms文件中删除对表,其关联和实体集的所有引用。 然后我关闭VS,重新启动,重新打开它,并重复“从数据库更新模型”。 我得到了相同的结果。 在模型浏览器中查看是否可以删除该类,但它不存在。 关闭我所有的VS窗口。 (一篇文章暗示了这一点。) 有人有建议吗? 先感谢您。

EF数据库首先如何更新数据库更改模型?

在类库中, Ado.net Entity Data Model已生成POCO类。 这些都是第一次生成。 但数据库的变化没有得到反映。 在edmx图中右键单击并Update Model from Database选择Update Model from Database显示新创建的表,但即使在选择要添加后也不添加表。 我尝试运行.tt(通过右键单击并运行自定义工具),但即使它没有根据最新的数据库更改重新生成Poco类。 请帮忙

我可以将UseCSharpNullComparisonBehavior用于单个查询吗?

我有一个查询,曾经是一个存储过程,并转换为EF查询。 现在是时候了。 使用SQL事件探查器,我可以看到生成的SQL的唯一区别是新的行为,其中EF将entity.Property == value into (entity.Property = @value OR (@value IS NULL AND entity.Property IS NULL)) 。 我知道我可以通过设置UseCSharpNullComparisonBehavior = false关闭整个上下文,但我真的只想为这一个查询执行此操作。 那可能吗? 或者,有没有办法编写EF查询,所以它不会像这样生成SQL?

EF 5-6.1.1中的NullReferenceException,具有相同类型的两个导航属性

我想首先谈谈我有一个解决这个问题的方法 – 但我今天花了几个小时搞清楚exception的原因,所以我想我会分享 给定域中的两个实体: public class User { public int Id { get; set; } public string Name { get; set; } } public class Ticket { public int Id { get; set; } public string Name { get; set; } public virtual User Owner { get; set; } public int? LockedByUserId { get; set; […]

仅将IDbInterceptor挂钩到EntityFramework DbContext一次

IDbCommandInterceptor接口没有很好的文档记录。 我只发现了一些稀缺的教程: http://www.entityframeworktutorial.net/entityframework6/database-command-interception.aspx https://msdn.microsoft.com/en-us/data/jj556606%28v=vs.113%29.aspx https://entityframework.codeplex.com/wikipage?title=Interception https://www.tutorialspoint.com/entity_framework/entity_framework_command_interception.htm https://msdn.microsoft.com/en-us/data/dn469464%28v=vs.113%29.aspx 还有一些问题: entity framework6 – 定时查询 从IDbCommandInterceptor的实现中获取DbContext 这些是我发现的挂钩建议: 1 – 静态DbInterception类: DbInterception.Add(new MyCommandInterceptor()); 2 – 在DbConfiguration类中执行上述建议 public class MyDBConfiguration : DbConfiguration { public MyDBConfiguration() { DbInterception.Add(new MyCommandInterceptor()); } } 3 – 使用配置文件: 虽然我无法弄清楚如何将DbConfiguration类挂钩到DbContext,也不知道如何将配置方法的type部分放入。 我发现的另一个例子似乎建议您编写记录器的命名空间: type=”System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework” 我注意到DataBaseLogger实现了IDisposable , IDbConfigurationInterceptor和 IDbInterceptor 。 IDbCommandInterceptor也实现了IDbInterceptor ,所以我尝试(没有成功)将其格式化为: type=”DataLayer.Logging.MyCommandInterceptor, DataLayer” 当我直接调用静态DbInterception类时,它在每次调用时都添加了另一个拦截器。 所以我的快速而肮脏的解决方案是利用静态构造函数: //This partial […]

entity framework一对多TPH映射

我正在使用类似于此的数据结构,其中动物的类型是从表中的鉴别器列确定的: public class Farm { public int Id { get; set; } public virtual ICollection Pigs { get; set; } public virtual ICollection Cows { get; set; } } public class Animal { public int Id { get; set; } public int FarmId? { get; set; } public virtual Farm Farm { get; set; } […]

使用具体类型实现ICollection 以满足Entity Framework

所以,这是一个迟钝的问题,但让我看看我是否可以相对简单地说出来。 可以说我有以下界面: public interface IFoo { ICollection Bars { get; set; } } 然后我实施: public class Foo : IFoo { public virtual ICollection Bars { get; set; } } 只有Entity Framework无法使用接口,所以它几乎完全忽略了这个导航属性。 为了让EF识别它,我需要将其更改为: public virtual ICollection Bars { get; set; } Bar应该是我对IBar实施。 只是,未能实现希望IBar不是Bar的界面。 现在,考虑一个稍微不同的场景,我刚刚得到一个基本的外键: public interface IFoo { IBar Bar { get; set; } } public […]