Tag: entity framework 4

如何修改edmx的默认代码生成策略?

我想修改默认的代码生成策略,我该怎么做? 我只想将类名从为Entities ,并将默认连接字符串更改为name=Default 。 (我不想为项目创建模板文件,我想编辑它以便全局工作) 我搜索过.tt文件,我只能找到ItemTemplates。 我不知道默认情况下生成代码是什么,这是我想要编辑的代码。 更新:我还是不知道该怎么做。

entity framework:在关联中使用非主要唯一键的替代解决方案

我知道entity framework工作不允许您使用非主要唯一密钥作为外键关联从数据库生成模型。 我可以手动修改EDMX吗? 如果是这样,有人能为我提供一个例子或参考吗? 如果没有,还有其他可能吗? 最简单的例子: 这是表格的DDL。 你会注意到我有一个从PersonType.TypeCode到Person.TypeCode的外键 CREATE TABLE [dbo].[PersonType]( [PersonTypeId] [int] NOT NULL, [TypeCode] [varchar](10) NOT NULL, [TypeDesc] [varchar](max) NULL, CONSTRAINT [PK_PersonType] PRIMARY KEY CLUSTERED ([PersonTypeId] ASC) CONSTRAINT [UK_PersonType] UNIQUE NONCLUSTERED ([TypeCode] ASC) ) CREATE TABLE [dbo].[Person]( [PersonId] [int] NOT NULL, [TypeCode] [varchar](10) NOT NULL, CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonId] ASC) ) […]

entity framework代码第一个CTP4默认列值?

我一直在寻找使用Entity Framework CTP4的Code First,您可以使用ModelBuilder来构建表列。 有没有办法使用ModelBuilder或其他一些机制为数据库中的列设置默认值? 谢谢!

entity framework4仅代码错误“不支持每种类型的多个对象集”

我有两个“仅代码”POCO使用EF4和最新的CTP,运行现有的遗留数据库。 对PocoA运行LINQ查询一直有效,直到我将下面的属性添加到该对象,我试图添加一个关系。 public virtual PocoB pocoB { get; set; } 一旦我这样做,我开始收到以下错误: Multiple object sets per type are not supported. The object sets ‘PocoA_DbSet’ and ‘PocoB_DbSet’ can both contain instances of type ‘PocoA’. 所以我接下来认为我的问题是因为我没有定义关系,这个遗留数据库在主键和外键上使用’fk / pk’前缀而不是’Id’后缀。 所以我将以下数据注释添加到上面指定的虚方法中,行为没有变化: [RelatedTo(Property=”PocoB”, ForeignKey=”fkPocoB”)] 我真的不知道需要改变什么来使这项工作。

EF存储库模式多对多插入

我们有2个表: 表权限: public class Authority { public int ID {get;set;} public string Name{get;set;} … } 表代理商 public class Agent { public int ID{get;set;} public int FirstName{get;set;} } 我们在这两个表之间存在多对多的关系: public class AuthorityConfiguration : EntityTypeConfiguration { public AuthorityConfiguration() : base() { HasKey(p => p.ID); HasMany(p => p.Agents).WithMany(a => a.Authorities).Map(mc => { mc.MapLeftKey(“AuthorityID”); mc.MapRightKey(“AgentID”); mc.ToTable(“AuthorityAgent”); }); ToTable(“Authority”); } […]

重用LINQ查询会导致另一个LINQ查询,而无需重新查询数据库

我的情况是我的应用程序根据用户指定的过滤条件使用PredicateBuilder构建动态LINQ查询( 除了:查看此链接以获得最佳EF PredicateBuilder实现 )。 问题是这个查询通常需要很长时间才能运行,我需要此查询的结果来执行其他查询(即,将结果与其他表连接)。 如果我正在编写T-SQL,我会将第一个查询的结果放入临时表或表变量中,然后围绕它写出我的其他查询。 我想从第一个查询中获取ID列表(例如, List query1IDs ),然后执行以下操作: var query2 = DbContext.TableName.Where(x => query1IDs.Contains(x.ID)) 这将在理论上起作用; 但是, query1IDs的ID query1IDs可以是数百或数千 (并且LINQ表达式x => query1IDs.Contains(x.ID)被转换为T-SQL“IN”语句,这是显而易见的原因) TableName中的行数以百万计 。 有没有人对处理这种情况的最佳方法有任何建议? 编辑1:关于我正在做什么的补充说明。 好的,我正在构建我的第一个查询(query1),它只包含我感兴趣的ID。基本上,我将使用query1来“过滤”其他表。 注意:我没有在LINQ语句的末尾使用ToList() —此时不执行查询,并且没有结果发送到客户端: var query1 = DbContext.TableName1.Where(ComplexFilterLogic).Select(x => x.ID) 然后我使用query1并使用它来过滤另一个表(TableName2)。 我现在把ToList()放在这个语句的末尾,因为我想执行它并将结果带到客户端: var query2 = (from a in DbContext.TableName2 join b in query1 on a.ID equals b.ID select new […]

为什么我的新.Net 4.0 EF应用程序会随机锁定?

我最近推出了一个新的ASP .Net应用程序。 此应用程序使用.Net 4.0和entity framework4.它是一个“基本”CRUD应用程序。 我几乎专门使用EntityDataSource进行数据访问。 用户报告了应用程序的“ocassional freeze”(他们都使用IE 8)。 如果用户关闭他的浏览器并开始备份,那么该应用程序就可以了。 它可能每天发生一次或两次,通常对于重度用户。 (所以,我一直倾向于内存泄漏或其他一些资源限制。) 直到不久前,我才从未见过这种情况。 它不会在客户端PC和服务器上的事件日志中留下任何内容。 此外,IIS错误日志或SQL日志中没有任何内容。 不久前,我终于明白了。 我正在将所有EntityDataSource切换为每页使用一个Object Context。 我下载了EF Profiler(它似乎是一个很棒的产品)并指出我在我的许多页面上使用多个对象上下文,因为它们中的许多都有多个EntityDataSource。 所以,我正在清理所有这些并测试每个页面,当看到的时候…… IE停止加载页面! 起初,页面开始缓慢加载(这是我已经修改为使用单个对象上下文的页面,所以尽管我仍然认为我需要在我的所有页面中实现这种“单例”模式,我想它不是’罪魁祸首!无论如何..),然后在某个时候我收到了: 消息:Sys.WebForms.PageRequestManagerTimeoutException:服务器请求超时。 事件日志中没有任何内容。 我还检查了IIS网络日志,但我没有看到任何内容,但是用肉眼看它们非常难以阅读,我可能需要下载解析器以确保其中没有任何内容。 无论如何,我决定启动另一个窗口并导航到我的应用程序,确定该窗口工作正常,没有问题。 我回到停止响应的窗口,刷新它,等待…转到我的应用程序的主页(这基本上只是一些静态的HTML ..而且没什么……)。 接下来,我在窗口中打开了一个当前冻结的新选项卡,该选项卡正常工作。 所以,我回到窗口,无法再从我的应用程序加载页面并尝试其他一些网站…. espn.com加载正常,msn.com加载正常,然后我输入我的应用程序主页的URL(并尝试了我的应用程序中的其他页面)和没有。 IIS甚至没有记录其日志文件中的尝试(就像IE刚刚决定不再为我的localhost做“获取”!)。 最后,在等待一段时间后(当我输入这篇文章时)我现在在该窗口中出现此错误消息: Internet Explorer无法显示该网页。 您可以尝试:问题可能是由各种问题引起的,包括:BLAH BLAH BLAH …… 所以,我跳回到那个窗口,它仍然可以浏览互联网网站。 但是,当我再次尝试访问我的应用程序中的任何页面时,我得到了NOTHING(在选项卡中旋转蓝色圆圈)。 所以,我再次在同一个浏览器中启动一个新选项卡,我可以浏览我的应用程序就好了。 我的应用程序对这个浏览器实例做了什么,它将不再允许它加载任何页面(事实上,它似乎甚至没有在任何应用程序页面上执行GET,因为IIS中没有任何新内容日志…除了当我在这些其他标签和/或浏览器窗口中加载页面工作正常,所以日志记录仍在工作……)? 我将永远感激那些可以帮助我解决这个问题的人。 我不确定它会带来多大的好处,但是我会留下这个浏览器窗口,因为有人可以告诉我一些事情来尝试诊断这个问题。 我觉得我很接近于弄清楚它。 我终于有了一个行为不端的窗口。 我害怕关闭窗口或在应用程序上进行新的构建,直到我得到一些关于尝试的好的输入…. 我应该补充一点,当发生这种情况时,我在我的本地PC上运行,所以我是唯一的用户,只有一个窗口打开应用程序.. 虽然,我完全难过!

entity frameworkCTP4和复合键

我正在玩EntityFramework CTP4并决定将它应用于我当前的一个项目。 该应用程序使用SQLServer数据库,并且有一个表具有复合键。 比如,表“MyEntity”将“Key1”和“Key2”作为外键(单独)和复合主键。 我创建了一个从EntityConfiguration派生的配置类: class MyEntityConfiguration : EntityConfiguration { public MyEntityConfiguration() { HasKey(m => m.Key1); HasKey(m => m.Key2); } } 然后在我的DataContext(从DbContext派生): public DbSet MyEntities { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new MyEntityConfiguration()); } 问题是当我查询“MyEntities”的所有记录时: var entities = from e in MyModel.Instance.MyEntities select e; 我得到一个非常奇怪的结果,包括重复18次的第一个记录,然后第二个重复18次(为了记录,我的表有36个记录)。 我怀疑问题出在复合键上,因为没有其他实体显示此问题。 任何帮助将不胜感激,谢谢:)

EF4审核多对多关系的变化

我正在将审核添加到我的EF4(模型优先)应用程序中。 我可以获得有关更改的实体的结构属性的详细信息。 我还可以看到多对多关系何时发生变化。 我可以看到涉及的类型的名称和发生的事情(添加或删除),但我真正喜欢的是关系变化中涉及的实体的Id。 以下是我目前用于跟踪多对多关系变化的内容: var changes = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified); var auditTime = DateTime.Now; foreach (var change in changes) { if (change.Entity != null && change.Entity.GetType().Equals(typeof(AuditTrail))) { continue; } var detailsBuilder = new StringBuilder(); if (change.Entity == null & (change.State == EntityState.Added | change.State == EntityState.Deleted)) { detailsBuilder.Append(“A link between entities “); […]

是否有可能让Entity Framework识别已创建但尚未保存在数据库中的对象?

Say Table1是一个包含两列的表。 Table1ID和名称。 如果我执行以下代码… var Obj1 = new Table1(); Obj1.Name = “hello” TestDBEntities.AddToTable1(Obj1); var currObj = Table1.Where(o => o.Name.Contains(“hello”)).FirstOrDefault(); currObj将返回null。 但是,如果我这样做 var Obj1 = new Table1(); Obj1.Name = “hello” TestDBEntities.AddToTable1(Obj1); **TestDBEntitles.SaveChanges();** var currObj = Table1.Where(o => o.Name.Contains(“hello”)).FirstOrDefault(); 然后currObj将返回我创建的第一个对象。 这是因为该对象在数据库中。 我正在创建一个大批量进程,我不希望将所有内容保存到数据库直到最后。 但是,我必须进行检查,例如确保某个对象尚未添加等,这需要我在将这些对象保存到数据库之前引用它们。 是否可以在Entity Framework中进行LINQ查询,该查询可以识别内存中尚未保存到数据库的对象。