Tag: entity framework 4

entity framework拆分表删除

我正在使用EF 4 STE来建模一个Attachment对象。 附件包含名称,描述,日期,最重要的是数据( byte[] )。 为了优化加载,我不希望在绝对必要之前检索Data属性,即当用户从客户端单击Download 。 为了遵循这种方法,我使用了这里描述的表拆分技术。 我将附件表拆分为附件 (名称,描述,日期)和附件数据(数据)。 这是我的EF模型中的一对一关系。 一切都很好,直到我尝试删除没有AttachmentData的附件 (即attachment.AttachmentData == null )。 我得到以下exception: 遇到无效数据。 缺少必需的关系。 检查StateEntries以确定约束违规的来源。 我看到了类似的post ,但我似乎无法使用STE和ApplyChanges扩展方法。 现在我的数据访问代码很简单:我调用context的ApplyChanges()然后调用SaveChanges() 。 我尝试了一个简单的删除SQL函数,并将其映射到两个实体,并实际工作; 但它打破了插入物。 我似乎无法将所有属性的插入函数映射到两个实体。 关于我可以尝试的其他一些选择的任何想法? Attachment和AttachmentData之间的关系可以是可选的吗? 当我将它设置为1到0+时,我得到一个映射错误,指出Their primary keys may collide 。 对任何建议开放。 谢谢!

Force Entity Framework使用SQL参数化来更好地重用SQL proc缓存

entity framework似乎总是在生成的SQL中使用常量来提供给Skip()和Take() 。 在下面的简化示例中: int x = 10; int y = 10; var stuff = context.Users .OrderBy(u => u.Id) .Skip(x) .Take(y) .Select(u => u.Id) .ToList(); x = 20; var stuff2 = context.Users .OrderBy(u => u.Id) .Skip(x) .Take(y) .Select(u => u.Id) .ToList(); 上面的代码生成以下SQL查询: SELECT TOP (10) [Extent1].[Id] AS [Id] FROM ( SELECT [Extent1].[Id] AS [Id], row_number() […]

EF4 Cast DynamicProxies到底层对象

我正在使用带有POCO模板的Entity Framework 4。 我有一个List,其中MyObject是动态代理。 我想使用XmlSerializer序列化此列表,但我不希望它们序列化为DynamicProxies,而是作为底层POCO对象。 我知道ContextOptions.ProxyCreationEnabled,但我不想使用它。 我只是想知道如何将代理对象转换为它的POCO序列化。

EF Code First – 全局设置nvarchar上的varchar映射

我有一个简单的问题,但我一直无法找到答案。 我正在使用EF4 CTP-5 Code First Model和手工生成的POCO。 它在生成的SQL中处理字符串比较 WHERE N’Value’ = Object.Property 我知道我可以使用以下方法覆盖此function: [Column(TypeName = “varchar”)] public string Property {get;set;} 这解决了该单个事件的问题,并正确生成SQL为: WHERE ‘Value’ = Object.Property 但是,我正在处理一个非常大的域模型并遍历每个字符串字段并设置TypeName =“varchar”将非常非常繁琐。 我想指定EF应该在整个板上看到字符串为varchar,因为这是该数据库中的标准,nvarchar是例外情况。 想要纠正这个问题的推理是查询执行效率。 varchar和nvarchar之间的比较在SQL Server 2k5中是非常低效的,其中varchar到varchar比较几乎立即执行。

entity framework4和查询结果的缓存

假设我有一个表或2包含永远或很少更改的数据,是否有任何尝试缓存这些数据的点? 或者,当我第一次加载数据时,EF上下文会为我缓存该数据吗? 我正在考虑从这些表中加载所有数据并使用静态列表或其他东西将数据保存在内存中,并在我需要同一上下文中的数据时查询内存数据而不是表。 我所说的那些表通常包含几百行数据。

如何更新在DbContext之外修改的实体?

如果实体在DbContext之外被更改(是一个分离的实体),我在更新实体方面遇到了一个小问题。 如果我附加修改后的实体,则其状态不会被修改。 我的代码如下所示: var specificationToSave = GetSpecificationFromTmpStore(userSessionGuid); using (var context = DataContextFactory.GetDataContext()) { // this works for update, if I change the values inside the context while debugging // but it breaks with new entities context.Specifications.Attach(specificationToSave); // this works for insert new entities, modified entities will be saved as new entities context.Specifications.Add((specificationToSave);) context.SaveChanges(); } 我知道NHibernate,它的方法是SaveOrUpdate。 […]

在entity framework中设置默认值 – Database First

我正在使用Entity Framework 4.3.1,其中包含数据库中自动生成的实体。 从这里,有没有办法将默认值设置为某种东西? 我不想把它放在自动生成的代码中,因为它会被覆盖。 我知道可以使用部分类,所以我尝试了类似的东西,其中生成了实体,而DESCRIPTION_是我想要设置为默认值的属性。 namespace name.Models { public partial class ENTITY { public string DESCRIPTION_ { set { _DESCRIPTION_ = “default string”; } } } } 也许如果有人能给我一个很棒的例子!

entity framework4 TPHinheritance,如何将一种类型转换为另一种?

我已经找到了一些有关这方面的信息,但还不足以让我理解这种情况的最佳实践。 我有你的典型TPH设置与抽象基类“公司”。 我有几个孩子“小公司”,“大公司”等inheritance自公司。 实际上,我实际上对公司有不同的现实分类,但我试图在这个例子中保持简单。 在根据TPH的数据库中,我有一个具有FirmTypeId列(int)的Firm表,用于区分所有这些类型。 一切都很好,除了我要求允许用户将一种类型的公司改为另一种公司。 例如,用户在添加公司时可能会犯错,并希望将其从Big Firm更改为Small Firm。 因为entity framework不允许将区分数据库列暴露为属性,所以我不相信有一种方法可以通过EF将一种类型更改为另一种类型。 如果我错了,请纠正我。 我看到它的方式我有两个选择: 不要使用TPH。 只需拥有一个公司实体并返回使用.Where(FirmTypeId == something)来区分类型。 使用context.ExecuteStoreCommand直接执行SQL以更新数据库的FirmTypeId列。 我看过一篇post,人们认为OOP的一个原则是实例不能改变它们的类型。 虽然这对我来说很有意义,但我似乎无法连接点。 如果我们遵循这个规则,那么唯一一次使用任何类型的inheritance(TPH / TPT)就是确定一种类型永远不会被转换为另一种类型。 因此,小公司永远不会成为一家大公司。 我看到应该使用构图的建议。 即使它对我没有意义(意思是我没有看到一家公司如何拥有一家大公司,对我来说,一家大公司是一家公司),我可以看到如果数据在哪里,可以如何在EF中建模组合。多个表格。 但是,在我在数据库中有一个表的情况下,它似乎是TPH或我在上面#1和#2中描述的内容。

C#4.0 / EF – SQL Server Compact不支持服务器生成的密钥和服务器生成的值

我刚刚将我的一个项目移动到VS2010 / fx4.0中,并使用SQL CE数据库作为后备存储。 自从将其移至此版本的.NET后,我现在收到此错误: SQL Server Compact不支持服务器生成的密钥和服务器生成的值。 我的表是用UserName(字符串)和DoorOpen(datetime)的PK定义的,因为SQLCE 要求 fx3.5中的每个表都有一个PK。 现在我在fx4.0中,我很难过。 我用Google搜索了这个,我找到的每个答案都是: SQLCE不支持自动生成值(我当然不需要),因此在其上放置一个GUID ID并从代码中填充它。 我试过这种方法,我仍然得到同样的错误! SQLCE: CREATE TABLE [ImportDoorAccesses] ( [RawData] nvarchar(100) NOT NULL, [DoorOpen] datetime NOT NULL, [UserName] nvarchar(100) NOT NULL, [CardNumber] bigint NOT NULL, [Door] nvarchar(4000) NOT NULL, [Imported] datetime NOT NULL, [ID] uniqueidentifier NOT NULL — new column ); ALTER TABLE […]

entity framework4中的多对多查询

我的数据库中有很多关系。 两个结束表是BlogPost和Item,中间的表是ItemBlogPost。 我需要找回与特定项目相关的所有BlogPost。 在SQL中,我会这样做: SELECT BlogPost.* FROM BlogPost JOIN ItemBlogPost ON BlogPost.ID = ItemBlogPost.BlogPost_ID WHERE ItemBlogPost.Item_ID = @Item_ID 在C#中我有类似的东西: IQueryable itemBlogPosts = from b in connection.BlogPosts where b.Items == item.ID orderby b.Content.CreateDate descending select b; 但是,标记为b.Items的行没有给出Item属性的列表,并且没有b.ItemBlogPost来查看中间表。 我也尝试过做b.Items.Contains(item)但也失败了。 如何在LINQ to EF4中完成这项工作?