Tag: entity framework

如何在Entity Framework中定义表达式选择嵌套的一对一关系

我正在尝试将包含此Expression的Linq-to-Entity运行到Entity Framework中。 不工作: //2 seperated expressions, 1st expression calling the 2nd expression public Expression<Func> UserToDtoExpr() { var expr = AddressToDtoExpr(); return x => new UserDto() { Id = x.Id, Name = x.Name, Address = expr.Compile()(x.Address) }; } public Expression<Func> AddressToDtoExpr() { return x => New AddressDto() { Id = x.Id, City = x.City, Country= x.Country […]

使用存储库模式切换LazyLoading

默认情况下,在我的DbContext中禁用了LazyLoading。 我使用存储库模式,在某些情况下,我只需要获取简单的对象,而在其他情况下,我需要获取具有导航属性值的对象。 如何为LazyLoading实现类似开关的东西? 任何帮助将不胜感激 我有一个有效的解决方案,但我不确定它是否正确:在存储库的界面中我添加了新属性 public interface IRepository where T : BaseEntity { T GetById(object id); void Insert(T entity); ….. bool LazyLoadingSwitches { set; } } 然后实现它: public bool LazyLoadingSwitches { set { this.context.Configuration.LazyLoadingEnabled = value; } } 当我需要获取相关数据的模型时,我在控制器中使用: repository.LazyLoadingSwitches = true; name = order.Customer.FullName; repository.LazyLoadingSwitches = false; 请建议我最好的解决方案是什么?

不支持使用类型1的输入和类型2的检查的LINQ抛出TypeAs表达式

这一行给了我‘TypeAs’表达式,其输入类型为User,不支持类型为SoftDeleteEntity的检查 : var test = this.partiallyFiltered.Where(additionalFilter).ToList(); 这就是那里的东西。 partiallyFiltered的类型为IQueriable 。 附加filter的类型为Expression<Func> ,并且传递的实际表达式(根据调试器)是!((x as SoftDeleteEntity).IsDeleted) 。 用户inheritanceSoftDeleteEntity。 我不认为我错过任何相关信息,但如果我告诉我,我会详细说明。 我明白必须有一个隐含的演员在某个地方不起作用,但我找不到它。 编辑:这里是表达式的声明,所有实体都是IEntity。 public static Expression<Func> DefaultFilter() where TEntity : IEntity { if (typeof(SoftDeleteEntity).IsAssignableFrom(typeof(TEntity))) return x => !(x as SoftDeleteEntity).IsDeleted; else return x => true; }

具有可选要求的EF Code First + Fluent关系的多重约束违规?

出于某种原因,我让我在EF 6项目上做了一段时间,我会尽量避免命名外键。 我定义了大部分模型而没有逐步测试它,因此我遇到了多样性和不完整的Fluent API定义问题: 来自’User_InternalAuth’AssociationSet的关系处于’已删除’状态。 给定多重约束,相应的’User_InternalAuth_Target’也必须处于’已删除’状态。 在一种情况下,这是代码: nModelBuilder.Entity() .HasOptional(u => u.InternalAuth) .WithRequired(a => a.User) .WillCascadeOnDelete(true); 我的理解是它说: 实体User 具有InternalAuth类型的可选属性InternalAuth 另一方面, InternalAuth有一个必需的属性User ,所以所有的 InternalAuth都有User但是User可能有也可能没有`InternalAuth。 如果User被删除,那么他的InternalAuth也会被删除(这是否会覆盖处理像nullables这样的选项的可选行为?) 但是当我尝试删除User我收到一个关于InternalAuth和User之间某种关联的多样性的例外。 如果EF了解关系的多样性,它是否有一种方法可以为它提供一个唯一的列名,那么有一个规范的命名约定? 如果是这样,您是否真的需要通过注释模型或通过Fluent API明确定义外键? 如果没有,我应该继续努力避免它,这是值得的还是可取的? (我正在考虑迁移数据模型,数据库管理,任何EF怪癖) 为什么尝试删除上述关系会违反多重约束? 还需要知道什么?

如何使用EntityFramework保存对象图,禁用延迟加载,禁用代理和实体是不可跟踪的

以下是我使用EF的情况。 存储库获取A的实例并返回到表示层(即MVC控制器) 控制器更改A实例上的某些属性,并将其返回以保持不变。 在持久化之前,我需要弄清楚对象所做的更改并validation是否允许更改。 为了比较更改,我需要数据库中的旧实例。 但EF返回相同的脏实例,所以我无法比较它们。 我尝试做什么:类结构 public Class A { public BB {get;set;} } public class B { public ICollection As {get;set;} public C c { get; set;} } public class C { } B和C映射到同一个数据库表。 虽然这是因为EF正在跟踪旧实例,并且因为实例上已经调用了save,所以它返回相同的inatce。 所以我关闭了延迟加载,代理生成,并将对象作为不可跟踪的存储库返回。 现在EF从DB返回新记录,但是如果在A上更改了某个属性,那么在B的A集合中,它只加载我更改的A实例,而不是整个集合。 如果我想创建一个新的A并保存,我会执行以下操作 B b = GetSomeOldB(); A =新A(); aB = b a.Save(); 所以我基本上将新A添加到上下文中并调用SaveChanges。 Ef返回和“无法将C转换为B”的exception。 基本上,我想要的只是在我要求的时候从上下文中获取旧的对象图,与脏的一个相比,让脏的东西持续存在。 非常感谢任何帮助!! 以下是最终实施的解决方案:1。关闭跟踪和代理创建2.从EF获取原始副本。 […]

解决ASP.NET MVC中的LINQ查询性能问题

加入新表后,我遇到LINQ查询问题。 实际上,它返回我期望的数据,并且在测试中运行得很快。 但是,似乎随着越来越多的用户连接到数据库,查询开始超时。 例如,在生产中的前30或45分钟内一切正常,但是在大约上午8:20,它开始超时。 同样,我认为这是由于整体上数据库的使用增加。 以下是ASP.NET MVC(5)应用程序的一些背景知识,如果有帮助的话。 用户向我们的诊所提交转诊 推荐包含一个或多个订单 如果提供的人员信息与现有人员不匹配,我会做几件事,包括在“订单”表中插入记录(在推荐中选择的每个订单的一个记录)。 如果提供的人员信息与我们系统中的现有人员匹配,那么我将“推荐”保留在队列中,直到通过将其与现有人员匹配或通过覆盖并在系统中创建新人员来手动解决。 此时,在表格中创建在引荐中选择的任何订单。 因此,在这种情况下要考虑的两个主要表是“推荐”(在我的代码中命名为“Referrals”)和“order”(在我的代码中命名为“ReferralPPAs”)表。 到目前为止,我还不需要将有问题的查询从Referrals表链接到ReferralPPAs表(将查询链接到ReferralPPAs表似乎是在数据库/应用程序使用增加时减慢查询的速度)。 此外,如果这有帮助,推荐由外部用户输入,而我从推荐创建的订单在一个单独的应用程序中工作,内部人员作为用户,尽管它们都在同一个数据库中。 ReferralPPAs表可能在一天中的大部分时间都被大量使用。 查询如下所示: IQueryable referrals = (from r in _context.Referrals join cu in _context.ClinicUsers on r.ClinicId equals cu.ClinicId /* Here is the seemingly problematic join */ from ppa in _context.ReferralPPAs .Where(p => p.ref_id == r.seq_no.ToString()) .DefaultIfEmpty() /* End of seemingly problematic […]

智能表达翻译

我正在创建一个IQueryable,我想用它来传递给entity framework的查询。 我的存储库不公开可查询。 var query = new List().AsQueryable().Where(x => x.Property == “argument”); 我的存储库中有一个方法可以接收IQueryable。 如何使用相同的可查询来查询我的DbSet? 我试图从可查询中提取表达式为dbset构建一个新的表达式。 这是我到目前为止,但它不起作用: public IDbSet DbSet { get; set; } public IEnumerable Find(IQueryable queryable) { var parameter = Expression.Parameter(typeof (TEntity)); var body = queryable.Expression; var lambda = Expression.Lambda<Func>(body, parameter); var result = DbSet.Where(lambda); return null; } 当我尝试使用以下错误创建lambda时代码失败:类型’System.Linq.IQueryable`1 [MyTEntity]’的表达式不能用于返回类型’System.Boolean’ 我显然没有正确构建表达式,我缺少什么? 有没有更简单的方法来做我想要完成的事情? 我还看到一些示例表明Expression应该有一个参数属性。 但无论我转换为什么类型的表达式类型,并且这个是ConstantExpression,我都没有看到IQueryable.Expression中的参数属性。

如何指定谓词的类型,直到运行时我才知道?

我的存储库方法从数据库中提取东西。 它接受排序顺序作为参数: IEnumerable getCars(Expression<Func> sort); 我使用TSortKey ,因为我不知道在运行时将使用哪个属性,它可能是x => x.Name或x => x.Make是字符串,但也可能是x => x.History.Age是一个整数。 用户选择排序顺序,然后在交换机中设置排序谓词并调用该方法。 Expression<Func> sortPredicate; switch (sortOption) { case SortOption.Name: sortPredicate = s => s.Name; break; case SortOption.Make: sortPredicate = s => s.Make; break; case SortOption.Age: sortPredicate = s => s.History.Age; break; default: sortPredicate = s => s.Name; break; } var cars = repo.getCars(sortPredicate); […]

当应用程序关闭时,DB连接会立即关闭吗?

这是我一直想知道的……会吗? 因为每当我编写代码来使用数据库连接时,我总会以某种方式确保在进入下一个进程之前关闭。 但是,当我有一个ChildWindow在其构造函数中打开一个连接而不是关闭它,直到它命中保存按钮或取消按钮。 然后,如果整个应用程序关闭,数据库连接会立即关闭吗? 或者它必须等待超时并自动关闭? 编辑: 所以我试图保持一个实时连接打开以记录我的应用程序上的所有错误: public App() { ErrorHelper errorHelper = new ErrorHelper(); // Will open DB connection AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(currentDomain_UnhandledException); } /// /// For catch all exception and put them into log /// void currentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { errorHelper.WriteError(e.ExceptionObject as Exception); } 因为我不喜欢每次打开连接时都记录一个错误,所以我想一直保持连接打开。 这与我描述的OP类似。 在这种情况下,它始终保持连接打开。 但是数据库连接在退出后会立即关闭吗?

EF:一对一的关系

我正试图建立一个双向的一对一关系。 但是,我无法获得两个实体的双向设置。 例如,假设一个人有一个电话号码,一个电话号码只能与一个人相关联。 我会: public class Person : Entity { public long PersonId { get; set; } public virtual PhoneNumber PhoneNumber {get; set; } } public class PhoneNumber : Entity { public long PhoneNumberId { get; set; } } 但是,通过这种重新安排,我无法获得双向设置。 即我不能有phoneNumber.Person. 我试过的: public class PhoneNumber : Entity { public long PhoneNumberId { get; set; } […]