Tag: ef database first

entity framework中多个“包含”的最佳实践是什么?

假设我们在数据模型中有四个实体:Categories,Books,Authors和BookPages。 还假设Categories-Books,Books-Authors和Books-BookPages关系是一对多的。 如果从数据库中检索类别实体实例 – 包括“Books”,“Books.BookPages”和“Books.Authors” – 这将成为一个严重的性能问题。 而且,不包括它们将导致“对象引用未设置为对象的实例”exception。 使用多个Include方法调用的最佳做法是什么? 写一个方法GetCategoryById并包含所有项目(性能问题) 写一个方法GetCategoryById并发送一个包含的关系列表(可能,但似乎还不够优雅) 编写方法,如GetCategoryByIdWithBooks,GetCategoryByIdWithBooksAndBooksPages和GetCategoryByIdWithBooksAndAuthors(不实用) 编辑 :通过第二个选项我的意思是这样的: public static Category GetCategoryById(ModelEntities db, int categoryId, params string[] includeFields) { var categories = db.Categories; foreach (string includeField in includeFields) { categories = categories.Include(includeField); } return categories.SingleOrDefault(i => i.CategoryId == categoryId); } 在调用时我们需要这样的代码: Category theCategory1 = CategoryHelper.GetCategoryById(db, 5, “Books”); Category theCategory2 […]

如何使用Entity Framework DB First的现有枚举

我首先使用Entity Framework 5,DB。 我知道如何在我的模型上定义枚举,并将字段的类型设置为该枚举。 现在,我需要将字段MyField映射到外部定义的枚举,即不在EF模型( OtherNamespace.MyEnum )中。 设计者不允许我将类型设置为模型之外的任何类型。 我尝试手动编辑edmx文件,但这会导致错误: 错误10016:解析项目’MyField’时出错。 exception消息是:’Unresolved reference’Othercomspace.MyEnum’。’。 我的项目引用了OtherNamespace.MyEnum 。 你怎么做呢?

带有Entity Framework的SQLite DATETIME列

我有一个现有的SQLite数据库,我想在Entity Framework中使用它。 然而,SQLite奇怪的类型系统意味着你甚至可以 create table temp(temp datetime); insert into temp values (‘whatever’); 日期存储为Unix时间整数。 我的模型类是由Visual Studio自动生成的,那么如何告诉代码生成器正确处理这些日期而不是让应用程序抛出 字符串未被识别为有效的DateTime。 启动时的exception?

无法使用现有数据库运行EF5迁移

首先,我已经阅读了这些问题/答案: EF迁移消息 如何在使用基于代码的迁移时停止添加迁移检查我的数据库没有挂起的迁移? 使EF4.3代码优先迁移忽略挂起的迁移 这些似乎都适用于EF5之前的EF版本,我的情况似乎不适合这些答案。 所以,让我描述一下我的情况。 我的应用程序最初是使用EF4创建的,模型优先。 我使用GUI设计器设计了我的数据库,并用它来生成我的数据库。 我已经运行并将数据收集到数据库中几个月了。 我真的不能丢失这些数据。 我分支我的代码,用NuGet安装EF5,并使用EF Power Tools通过右键单击新的类库项目从我的数据库生成我的模型,然后选择Entity Framework | Reverse engineer code first Entity Framework | Reverse engineer code first 。 我能够顺利地重新引用我的新项目,将我的项目转换为使用新的DbContext而不是ObjectContext,并删除了保存旧模型的EF4类库。 该计划效果很好! 现在,我想尝试自动迁移,我在Ruby on Rails中有一些经验。 这是我做的: Ran Enable-Migrations 。 由于连接字符串和app.config被使用而有点麻烦,但最终得到了它。 但是, 这个MSDN页面说这应该自动生成第一次迁移,以使我达到我已经到达的程度。 它没有。 Ran Add-Migration InitialSchema来完成在步骤1中未自动完成的操作。这有效。 向我的某个模型对象添加了一个属性,然后尝试运行Add-Migration AddSerialToLogEntries ,并显示: 由于以下显式迁移未决,因此无法生成显式迁移:[201307190100268_InitialSchema]。 在尝试生成新的显式迁移之前应用挂起的显式迁移。 尝试在我现有的数据库上应用迁移失败,这并不奇怪。 我上面提到的其他答案基本上说我运气不好,但就像我说的那些是旧版本的entity framework。 我有什么选择吗? 在写这个问题时,我想我可以使用SQL Server Management […]

DB-First与ASP.NET Web API 2 + EF6的身份validation混淆

我需要为现有的MySQL数据库创建一个Web API C#应用程序。 我已经设法使用Entity Framework 6将每个数据库表绑定到RESTful API (允许CRUD操作) 。 我想实现一个登录/注册系统(以便我将来可以实现角色和权限,并限制某些API请求) 。 我必须使用的MySQL数据库有一个用户表(称为user ) ,其中包含以下不言自明的列: id email username password_hash 似乎事实上的身份validation标准是ASP.Net Identity。 我花了最后一小时试图弄清楚如何使Identity与现有的DB-First Entity Framework设置一起工作。 如果我尝试构建存储user实例(来自MySQL数据库的实体)的 ApplicationUser实例来检索用户数据,我会收到以下错误: 实体类型ApplicationUser不是当前上下文的模型的一部分。 我假设我需要在我的MySQL数据库中存储身份数据,但找不到任何有关如何执行此操作的资源。 我已经尝试完全删除ApplicationUser类并使我的user实体类派生自IdentityUser ,但调用UserManager.CreateAsync导致LINQ to Entities转换错误。 如何在具有现有user实体的Web API 2应用程序中设置身份validation?

entity frameworkDB-First,实现inheritance

我正在尝试使用entity framework6.0和数据库第一种方法实现inheritance。 好吧,假设我有一个人和Organization实体,如下所示: // a simplified version of organization entity public class Organization { public Guid ID { get; set; } public string Nickname { get; set; } public string Email { get; set; } public string PhoneNumber { get; set; } public string OfficialName { get; set; } public Guid CEOID { get; set; […]

建模多态关联数据库优先与代码优先

我们有一个数据库,其中一个表包含可以是其他几个表的子记录。 它有一个“软”外键,由所有者的Id和表名组成。 这种(反)模式被称为“多态关联”。 我们知道它不是有史以来最好的数据库设计,我们会在适当的时候改变它,但不会在不久的将来改变它。 让我举一个简化的例子: Event , Person和Product都有评论记录。 如您所见,没有严格的FK约束。 在Entity Framework中,可以通过将Comment化为EventComment等来支持这个模型,并让Event有一个EventComments集合等: 从数据库生成基本模型后,手动添加子类和关联。 OwnerCode是此TPH模型中的鉴别器。 请注意, Event , Person和Product是完全不同的实体。 为它们建立一个公共基类是没有意义的。 这是数据库优先的。 我们的现实模型就像这样,没问题。 好。 现在我们想要转向代码优先。 所以我开始将数据库逆向工程化为代码优先模型(EF Power Tools),然后继续创建子类并映射关联和inheritance。 试图连接到Linqpad中的模型。 那是麻烦开始的时候。 尝试使用此模型执行查询时,它会抛出InvalidOperationExeception 外键组件“OwnerId”不是“EventComment”类型的声明属性。 validation它是否未从模型中明确排除,并且它是有效的原始属性。 当我有双向关联并且OwnerId被映射为Comment的属性时会发生这种情况。 我的EventMap类( EntityTypeConfiguration )中的映射如下所示: this.HasMany(x => x.Comments).WithRequired(c => c.Event) .HasForeignKey(c => c.OwnerId); 所以我尝试在模型中没有OwnerId映射关联: this.HasMany(x => x.Comments).WithRequired().Map(m => m.MapKey(“OwnerId”)); 这会抛出MetaDataException 指定的架构无效。 错误:(10,6):错误0019:类型中的每个属性名称必须是唯一的。 已定义属性名称“OwnerId”。 (11,6):错误0019:类型中的每个属性名称必须是唯一的。 已定义属性名称“OwnerId”。 如果我删除三个实体注释关联中的两个,那就没关系,但当然这不是治愈方法。 […]

如何使用EntityFramework 7和Asp.Net 5调用SQL存储过程

在过去的几天里,我正在寻找一些关于如何使用EntityFramework 7从Web API控制器方法中调用Stored Procedure教程。 我通过的所有教程都反过来展示了它,即Code First方法。 但我已经有了一个数据库,我需要用它来构建一个Web API 。 各种业务逻辑已经编写为存储过程和视图,我必须使用来自Web API的那些逻辑。 问题1:这是否可以继续使用EF7 Database First方法并使用上面的数据库对象? 我通过以下NuGet命令将EntityFramework 6.1.3安装到我的包中: install-package EntityFramework ,它将版本6.1.3添加到我的项目中,但立即开始显示错误消息(请参阅下面的屏幕截图)。 我不清楚如何解决这个问题。 我有另一个测试项目,在project.json我可以看到两个如下的条目: “EntityFramework.MicrosoftSqlServer”: “7.0.0-rc1-final”, “EntityFramework.MicrosoftSqlServer.Design”: “7.0.0-rc1-final”, 但是,当我在Nu-Get包管理器中搜索时,我看不到这个版本! 只有6.1.3即将到来。 我的主要目标是从现有数据库中使用已编写的存储过程和视图。 1)我不想使用ADO.Net ,而是想使用EntityFramework来使用ORM 2)如果EntityFramework 6.1.3能够从现有数据库调用Stored Procs和Views ,我如何解决错误(截图)? 实现这一目标的最佳做法是什么?