Tag: entity framework

Automapper:使用Entity Framework 4 Proxy Pocos在inheritance上映射问题,在集合上映射抽象基类

我有一个问题,使用AutoMapper(这是一个很好的技术)来映射一个业务对象到一个DTO的地方,我从集合中的抽象基类inheritance。 这是我的对象: abstract class Payment class CashPayment : Payment class CreditCardPayment : Payment 我还有一个发票对象,其中包含如下付款的集合: public class Invoice { … properties… public ICollection<Payment> Payments { get; set; } } 我也有这些对象的每个相应的DTO版本。 DtoInvoice对象被定义为: [DataContract] public class DtoInvoice { …properties… [DataMember] public List<DtoPayment> Payments { get; set; } } 这就是我的Mapper定义的样子: Mapper.CreateMap<Invoice, DtoInvoice>(); Mapper.CreateMap<Payment, DtoPayment>() .Include<CashPayment, DtoCashPayment>() .Include<CreditCardPayment, DtoCreditCardPayment>(); Mapper.CreateMap<CashPayment, […]

EF数据上下文 – asynchronous/等待和multithreading

我经常使用async / await来确保ASP.NET MVC Web API线程不被更长时间运行的I / O和networking操作阻塞,特别是数据库调用。 System.Data.Entity命名空间在这里提供了各种帮助器扩展,如FirstOrDefaultAsync , ContainsAsync , CountAsync等等。 但是,由于数据上下文不是线程安全的,这意味着下面的代码是有问题的: var dbContext = new DbContext(); var something = await dbContext.someEntities.FirstOrDefaultAsync(e => e.Id == 1); var morething = await dbContext.someEntities.FirstOrDefaultAsync(e => e.Id == 2); 事实上,我有时会看到例外,例如: System.InvalidOperationException:连接未closures。 连接的当前状态是打开的。 那么是否正确的模式使用单独的using(new DbContext…)块为每个asynchronous调用数据库? 那么执行同步操作可能会更有益吗?

存储库模式解决什么特定的问题?

(注:我的问题与三个月前提出这个问题的人非常相似,但是没有回答。) 我最近开始使用MVC3 +entity framework,我一直在阅读,最好的做法是使用存储库模式来集中访问DAL。 这也伴随着解释,你想保持DAL独立于领域,特别是视图层。 但在我见过的例子中,知识库是(或似乎是 )简单地返回DAL实体,即在我的情况下,知识库将返回EF实体。 所以我的问题是,如果只返回DAL实体的存储库有什么好处呢? 这是否增加了一层复杂性,不能消除在层之间传递DAL实体的问题? 如果存储库模式创build一个“进入DAL的单一入口点”,这与上下文对象有何不同? 如果存储库提供了检索和保留DAL对象的机制,那么与上下文对象有什么不同呢? 此外,我至less在一个地方读到工作单元模式集中存储库访问,以pipe理数据上下文对象,但我不明白为什么这也很重要。 我98.8%肯定我在这里错过了一些东西,但从我的阅读中我没有看到。 当然,我可能只是没有阅读正确的消息来源:

如何禁用entity framework4.3中的模型兼容性检查?

我正在使用EF 4.3,并且有一个上下文需要与使用EF Code First 4.3的另一个库生成的数据库进行通信。 上下文抛出一个exception说明 自创build数据库以来,支持“上下文”上下文的模型已经发生了变化。 考虑使用Code First Migrations来更新数据库 在EF 4.1中,可以通过从模型构build器中删除IncludeMetadataConvention来将其删除。 然而,在4.3中这个惯例已经被废弃了,不再有效果。 我怎么能EF 4.3上下文对由不同的上下文构build的EF 4.3生成的数据库? 我发现唯一的select(这是远远不是理想的)是删除元数据表,从而导致两个上下文假设数据库不由EF生成。 PS:我知道这种情况可能会引起我为什么需要这样做的问题; 我知道这是远远不够理想,但放心,这是我需要解决的问题,并有限的select,以横向工作。

entity frameworkcaching问题

我是entity framework的新手。 我已经在我的数据库中使用EF得到了一些值。 它完美地返回,值显示在标签中。 但是,当我删除我的表中的所有值(不使用EF),EF查询返回我的旧值。 我知道EF将这些值存储在caching中,并返回caching的数据以供后续运行。 它是否正确? 那么我怎样才能解决问题,当我已经删除了我的数据库中的所有值,但EF返回旧值? 编辑 : 现在我使用datamodel.SaveChanges() 。 但现在它返回相同的旧值。 我的示例查询如下所示: SchoolBriefcaseEntities datamodel = new SchoolBriefcaseEntities(); datamodel.SaveChanges(); List<Compliance> compliance=new List<Compliance>(); IList<ComplianceModel> complianceModel; if (HttpContext.Current.User.IsInRole("SuperAdmin")) { compliance = datamodel.Compliances.Where(c => c.School.DistrictId == districtId).ToList(); }

如何select哪里不存在使用LINQ?

我必须列出要分配给“ 员工 ”的所有“ class次 ”数据,但是如果class次数据已经存在于员工数据中,则不得包含class次数据。 让我们看看图片样本。 这个查询解决了这个问题。 我在这里find了这个: 斯科特的博客 select * from shift where not exists (select 1 from employeeshift where shift.shiftid = employeeshift.shiftid and employeeshift.empid = 57); 我们来看看结果: 现在我的问题是,我怎么能在linQ中做到这一点? 我正在使用entity framework。 希望有人可以帮忙。 非常感谢!!!

如何获取entity framework来更新复杂types?

我正在使用entity framework(EF)从存储过程创build一个复杂的types。 最近,存储过程发生了变化(更多的返回值被添加了,我想更新映射到这个存储过程的复杂types,这是可能的,如果是这样的话,我现在每次删除我的函数import和complextypes存储过程更改,这很可能不是最好的方法。

如何删除EF代码第一个数据库中的儿童一对多的相关logging?

那么,我有一个一对多的相关模型: public class Parent { public int Id { get; set; } public string Name { get; set; } public ICollection<Child> Children { get; set; } } public class Child { public int Id { get; set; } public string ChildName { get; set; } } 我想要做的是清除Parent.Children并从数据库中删除相关的子实体。 我已经试过了: 数据库上下文类: modelBuilder.Entity<Parent>() .HasMany(p => p.Children) .WithOptional() .WillCascadeOnDelete(true); […]

在协作环境中迁移entity framework

我们有多个开发人员在使用Entity Framework 5.0的项目上工作。 每个开发人员都使用他自己的本地SQL 2012数据库,以便在不妨碍其他人的情况下开发和testing。 起初,我们使用了自动迁移和基于代码的迁移的混合。 这根本不能很好地工作,所以我们决定禁用自动迁移,只允许基于代码。 我应该补充一点,我们再次启动一个干净的数据库,没有从所有的自动迁移中“损坏” _MigrationsHistory 。 所以现在的工作stream程是: 开发人员更改他的数据模型 add-migration <Name>并将其应用到他的数据库与update-database 。 检查数据模型更改和迁移到Git。 另一个开发人员将接收更改并将其应用于其数据库。 到目前为止,这工作得很好。 然而,在今天之前,通常只有我是使移民和其他人实行移民。 但是今天有三个开发者的迁移。 我只是把这些迁移,做了一个update-database ,这很好。 然而,我也对自己的datamodel进行了修改,所以在update-database的最后,它给了我一个警告,说明我还没有及时更新,所以我做了add-migration <my migration> 。 但是,当它支持迁移时,它给了我已经应用到数据库的所有迁移的变化。 所以:它试图删除已经被删除的列,尝试创build一个已经存在的表等。 怎么可能? 我的假设是,EF只会检查_MigrationsHistory表,并找出表中尚未出现哪些迁移,然后逐一应用名称中包含的时间戳。 但显然不是,因为即使当我撤消自己的变化,我有一个干净的环境,它仍然抱怨我的数据库不与模型同步。 但我只是把这些改变,并将其应用到我的数据库。 它是同步的。 我可以看到我刚刚在_MigrationsHistory表中应用的迁移。 我能想到的唯一的事情是我添加了一个属性到一个datamodel,不会导致数据库的变化(我添加了一个List<X> datamodel Y其中X是在一对多关系中的许多。这不会导致数据库更改,因为X已经有一个外键到Y)。 那可以吗? 如果是这样,这真的很脆弱,因为没有办法为此添加迁移,因为没有数据库更改,我不知道如何解决这个问题。 我不知道如何处理这个问题,因为我当然可以编辑它的脚手架,并删除已经应用到我的数据库的所有东西。 但是呢? 我检查了一下,然后其他一些开发者得到了同样的信息,即使在应用我的新变更之后,他的数据库也没有及时更新,脚手架自己的变化,得到同样的废话脚手架,编辑它,检查它,然后下一个开发人员得到它。 它变成了一个恶性循环,与我们使用自动迁移时所遇到的类似,我认为我们已经通过切换到仅基于代码的方式来解决这个问题。 现在我不能相信它做正确的事情,这是一个噩梦,这样的工作。 我也尝试过使用update-database -t:201211091112102_<migrationname>将我从同事那里获得的迁移一一添加,但无济于事。 它仍然给我错误的脚手架。 那么,我们在这里做错了什么,或者EF是不是为这样的协作而build? UPDATE 我创build了一个可重复的testing用例,但是为了模拟这个多用户/多数据库场景,这是一个漫长的舞蹈。 https://github.com/JulianR/EfMigrationsTest/ 有上述项目时重现的步骤(这些步骤也存在于代码中): 添加迁移Init 更新数据库(在数据库'TestDb') 将连接string更改为指向TestDb1 […]

如何从entity framework模型中删除一个对象,而无需先加载它?

我确定我已经在某个地方看到了这个问题的答案,但是因为我在SO或者谷歌上search了几个search词,所以无论如何我都会问这个问题。 在entity framework中,删除数据对象的唯一方法似乎是 MyEntityModel ent = new MyEntityModel(); ent.DeleteObject(theObjectToDelete); ent.SaveChanges(); 但是,这种方法要求首先将对象加载到控制器中,只是将其删除。 有没有办法删除仅引用其实例ID的业务对象? 如果使用Linq或Lambdaexpression式更聪明,那也可以。 但是,主要目标是避免加载数据只是为了删除它。