Tag: entity framework

将entity framework模型从Web项目移动到类库中

我正在使用Entity Framework,并且最近意识到将EF模型放在同一解决方案中的另一个项目中的好处,以便我可以从中构建多个UI。 我将其移动到新的类库项目并更新了对Web项目中实体的所有引用,以使用项目生成的新dll。 除了一个小障碍外,一切都很顺利。 当我将EF移动到新项目时,不知何故它仍然从web项目中的web.config读取它的连接字符串(不要问我怎么,因为我没有线索)。 我在EF设计器中使用了“从数据库更新模型”并且没有找到连接字符串(正如我将其移动到新项目时所预期的那样)所以我使用向导生成了一个新的连接字符串,它做得很好。 新的连接字符串现在位于类库项目中的App.config中。 属性窗口中的连接字符串现在是正确的,设计人员正在从App.Config中读取它。 我继续并从Web项目中的Web.Config中删除了连接字符串。 现在运行应用程序时出现以下错误: 指定的命名连接在配置中找不到,不打算与EntityClient提供程序一起使用,或者无效。 如果我将连接字符串粘贴回Web.Config,它一切正常。 我不想从头开始创建一个新的EF模型,因为它是一个相当复杂的模型,我从数据库中提取后做了很多重组。 我已经把生成的CS文件以及edmx文件中的XML倾倒了,找不到任何有用的东西。 任何帮助深表感谢。 显然现在,直到我弄明白,我只是将连接字符串留在web.config中,因为无论出于何种原因,这似乎都有效。

使用Fluent API的EF外键

这是我的模特。 我有一对一的车辆和司机映射。 我将首先创建车辆,然后将驾驶员映射到车辆。 public class Driver { public int Id { get; set; } public String Name { get; set; } public int VehicleId { get; set; } public virtual Vehicle Vehicle { get; set; } } public class Vehicle { public int Id { get; set; } public String Name { get; set; } […]

如何获取ObjectSet 的实体密钥名称?

我在我的通用存储库中创建了一个通用的ObjectSet 。 我想得到的是ObjectSet的EntityKey的name ,以便我可以在DataContext.GetObjectByKey使用它。 我已经四处搜索并深入挖掘,但我似乎无法在ObjectSet类中的任何位置找到此值。

如何在不迭代的情况下将Linq结果转换为DTO类对象

我正在构建一个Web API项目,该项目将提供给第三方并由我自己的Web应用程序使用。 Web API方法将返回复杂类型/对象的JSON表示。 这些是我可以提供给第三方的预定义类,因此他们了解数据的结构,并可以反序列化JSON。 我会将这些类称为DTO类,直到有人纠正我为止。 我有以下自动生成的实体模型(来自数据库),这是用户类无论如何与扫描表的关系(为了这个问题可以忽略关系)… public partial class User { public User() { this.Scans = new HashSet(); } public int Id { get; set; } public string Username { get; set; } public string Password { get; set; } public bool Active { get; set; } public virtual ICollection Scans { get; set; […]

过滤Entity Framework查询中的“包含”表

这适用于.NET 3.5的Entity Framework: 我需要查询一个表并包含一对多关系的“多”表的集合。 我试图过滤该集合作为查询的一部分 – 我对Entity Framework很新,而且我很难搞清楚它。 简化示例:作者具有书籍,而书籍具有IsFiction列。 我想要一个过滤的作者列表,以及所有小说书籍。 没有filter,很容易: var q = from a in db.Authors.Include(“Books”) where a.BirthYear > 1900 select a; 事后我可以过滤,例如: var fictionBooks = a.Books.Where(b => b.IsFiction); 但问题是原始查询已经运行,并包含那些结果,这是不必要的数据库处理。 我可以单独查询,例如: var q = from a in db.Authors where a.BirthYear > 1900 select a; foreach (var a in q) { var books = […]

实现IQueryable包装器以转换结果对象

更新2013-08-22: 在看了“建立一个IQueryable提供者系列”之后(感谢链接!)我进一步了解了一下。 我相应地更新了代码。 它仍然没有完全工作。 如果我正确理解了教程,则在请求多个元素的情况下调用GetEnumerator (例如,通过对可查询或任何聚合函数的ToList()调用)。 因此,包装器的所有GetEnumerator实现都要在提供程序上调用Execute并传递可查询的表达式。 在另一种情况下,如果只请求一个元素,则直接调用Execute 。 queryable的表达式还反映了它是单个元素还是多个元素。 它是否正确? 不幸的是,现在我在源查询提供程序上调用Execute时得到一个InvalidOperationException,说‘Sequence包含多个元素’ 。 这是什么意思? 我只是传递表达式而没有任何翻译,因为如上所述涉及相同的类型。 代码中IEnumerable的翻译位可能不完整,但是现在我甚至没有达到这一点。 我正在尝试使用单个底层IQueryable作为数据源来实现一个简单的IQueryable包装器,该数据源为每个结果对象调用转换函数。 我认为这将是相对微不足道的,因为包装器必须做的唯一事情就是翻译。 但是我无法让我的实现工作。 请看下面我到目前为止所得到的内容。 对于某些查询,它正在工作,但我在某些时候收到StackOverflowException InvalidOperationException。 我想这是因为我的queryable和我的查询提供程序之间的循环关联。 但我不明白如何正确实现这一点。 在这里我的问题和想法: 1.为什么IQueryable有一个Provider又可以再次返回IQueryable? 这不是要求无休止的递归吗? 2.为什么不能实现IEnumerator? 为什么FirstOrDefault不使用枚举器来获取元素? 当我调试应用程序时GetEnumerator()没有被我的可查询器上的FirstOrDefault()调用。 3.由于在每种情况下都没有使用枚举器,因此调用翻译函数的正确位置在哪里? QueryProvider的Execute-methods似乎是正确的地方。 但是在某些情况下,我仍然需要在枚举器中进行翻译调用吗? 更新:我知道我需要提供自己的IEnumerable实现,提供TranslatingEnumerator并从我的Execute方法返回此枚举。 为了让枚举器GetEnumerator调用Execute (见下文)。 请求枚举器的LINQ代码似乎确保表达式实际返回IEnumerable 。 关于代码的一些附注: 翻译源类型名为TDatabaseEntity ,翻译目标类型名为TBusinessEntity 。 我基本上提供了一个IQueryable,它从基础IQueryable中获取结果对象,并将它们转换为TBusinessEntity 类型 对象 。 我知道表达式也需要翻译。 但是我把它放在一边,因为在我的实际应用程序中,我使用相同类型的TBusinessEntity和TDatabaseEntity,因此Expression可以直接传递。 尽管属性相同,但结果对象仍然需要转换为其他实例。 更新:我的翻译层已经在我的应用程序中工作,并且还负责相关实体。 它只是’实现一个IQueryable包装’的东西,我坚持。 我担心整个实现都是错误的 – 代码中的TODO只是我自己的注释。 背景:我在我的数据访问层中实现了自己从DbContext接收的实体的分离,以防止我的业务层与实际实体联系 […]

Group by,Count和Lambda Expression

我正在尝试翻译以下查询: SELECT STATE, COUNT(*) FROM MYTABLE GROUP BY STATE; 进入lambda表达式。 我正在使用C#和EntityFramework,但似乎我无法使其工作。 到目前为止,这是我在我的存储库中的内容: public IEnumerable PorcentajeState(Guid id) { return _context.Sates.Where(a => a.Id == id) .GroupBy(a => a.State) .Select(n => new { n.StateId , n.Count() }); } 当然它没有编译,我在谷歌搜索2小时后迷路了。 请你帮助我好吗? 提前致谢

从Controller访问数据库实体

TL;博士 在一个很好的设计。 应该在单独的业务逻辑层(在asp.net MVC模型中)处理访问数据库,还是可以将IQueryable s或DbContext对象传递给控制器​​? 为什么? 各自的优点和缺点是什么? 我正在用C#构建一个ASP.NET MVC应用程序。 它使用EntityFramework作为ORM。 让我们稍微简化一下这个场景。 我有一个可爱的蓬松小猫数据库表。 每只小猫都有小猫图像链接,小猫蓬松指数,小猫名称和小猫ID。 这些映射到EF生成的名为Kitten POCO。 我可能会在其他项目中使用此类,而不仅仅是asp.net MVC项目。 我有一个KittenController应该在/Kittens取得最新的蓬松小猫。 它可能包含选择小猫的一些逻辑,但没有太多的逻辑。 我一直在和朋友争论如何实现这一点,我不会透露双方:) 选项1:控制器中的db: public ActionResult Kittens() // some parameters might be here { using(var db = new KittenEntities()){ // db can also be injected, var result = db.Kittens // this explicit query is here .Where(kitten=>kitten.fluffiness > 10) […]

json.net; 序列化entity framework对象(循环引用错误)

我有一个entity framework实体,我想序列化为一个json对象。 我环顾四周,发现json.net(http://james.newtonking.com/projects/json-net.aspx)应该能够使用“开箱即用”的循环引用来序列化对象。 所以我尝试使用 string json = JsonConvert.SerializeObject(/* my ef entity */); 但我仍然得到同样的错误。 问题可能是我需要使用ReferenceLoopHandling.Ignore和ContractResolver ,但我不知道如何使用它们。 任何帮助深表感谢! 谢谢

如何使用Model First方法使用动态连接字符串,但仍然使用EDMX中的数据模型?

我使用EF 5使用Model First方法创建了一个EDMX,即我从一个空白设计师开始并模拟我的实体。 现在,我希望能够使用EDMX中定义的此模型,但提供运行时SQL Server连接字符串,而无需修改配置文件。 我知道如何将连接字符串传递给DbContext但问题是找到程序集中映射的元数据。 例如,我的EDMX在app.config中有这个连接字符串 我缺少的部分是”metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;” 我希望能够以编程方式创建一个DbContext传入SQL Server连接字符串,但“添加”元数据部分。 这就是我希望T4文件生成的内容…… public partial class MesSystemEntities : DbContext { public MesSystemEntities() : base(“name=MesSystemEntities”) { } public MesSystemEntities(string sqlServerConnectionString) : base(GetEfConnectionString(sqlServerConnectionString)) { } private string GetEfConnectionString(string sqlServerConnectionString) { // values added by T4 generation string format = “metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;;provider=System.Data.SqlClient;provider connection string=\”{0}\””; return String.Format(format, sqlServerConnectionString); } … } 我的问题是如何在T4生成文件中获取我需要的元数据来创建entity […]