EF6.1.2 RTM Available
Today we are pleased to announce the availability of EF6.1.2. This patch release includes a number of high priority bug fixes and some contributions from our community.
What’s in EF6.1.2?
EF6.1.2 is mostly about bug fixes, you can see a list of the fixes included in EF6.1.2 on our CodePlex site.
We also accepted a couple of noteworthy changes from members of the community:
Query cache parameters can be configured from the app/web.configuration file
<entityFramework> <queryCache size='1000' cleaningIntervalInSeconds='-1'/> </entityFramework>
SqlFile and SqlResource methods on DbMigration allow you to run a SQL script stored as a file or embedded resource.
Where do I get EF6.1.2?
The runtime is available on NuGet. Follow the instructions on our Get It page for installing the latest version of Entity Framework runtime.
The tooling is available on the Microsoft Download Center. You only need to install the tooling if you want to create models using the EF Designer, or generate a Code First model from an existing database.
- Download tooling for Visual Studio 2012
- Download tooling for Visual Studio 2013
- The tooling will be included in future releases of Visual Studio 2015 (currently in preview).
Thank you to our contributors
We’d like to say thank you to folks from the community who have contributed to the 6.1.2 release so far:
- BrandonDahler
- ErikEJ
- Honza Široký
- martincostello
- UnaiZorrilla
What’s next?
In addition to working on the next major version of EF (Entity Framework 7), we’re also working on another update to EF6. This update to EF6 is tentatively slated to be another patch release (EF6.1.3) and we are working a series of bug fixes and accepting pull requests.
Comments
Anonymous
December 22, 2014
Just installed 6.1.2. and ran into problems. I have this TPH design structure that has a Category property (typeof(int)) at the toplevel class. In my derived classes I do something like: public new AddressTypes Category { get { return (AddressTypes)base.Category; } set { base.Category = (int)value; } } where AddressTypes is an Enum. This worked fine until 6.1.2. Now I receive an error "The item with identity 'Category' already exists in the metadata collection" when I starts the application. Any suggestionsAnonymous
December 23, 2014
@Thijs Why do you need Discriminator as property? Discriminator is just a Type of concrete class. Doing query you don't need Discriminator, because you can use Type. For example: Ok: dbContext.OfType<ConcreteA>()... Unnecessary: dbContext.Where(x => x.Category == AddressType.ConcreteA)... Another thing, Discriminator is something immutable per class. Instance of class ConcreteA, should not change its Category to ConcreteB, because it is still ConcreteA = why you need setter for Category?Anonymous
December 23, 2014
I made a mistake while typing, "table" property is missing. Should be sth like this: dbContext.SomeTable.OfType<ConcreteA>() If I misunderstand you, and your Category property is not a Discriminator in TPH, there is still sth wrong. Why base class has int, not an Enum? EF supports enum very well. Maybe there is some bug in EF... but I'm pretty sure that your code is wrong :) Am I missing something?Anonymous
December 23, 2014
@Mad The Category property is just typeof(int) in my base class and database. It has nothing to do with the discriminator. In my derived classes I use this Category for various reasons and it is only in the derived classes that they are casted to enums. So a Category in derived class A can have other (enum) values than derived class B. As stated, it worked fine in EF 6.1.1, so my code should be fine. I uninstalled 6.1.2 and reinstalled 6.1.1 and everything works again. But what is going on? I designed a Code first solution with only two tables with which I can serve many customers and it;s realy fast. My TPH model looks like : Abstract base class A: class B: A (mapped to table 1) class C: A (mapped to table 2)
60 classes that go down this hierarchy Hope you can help me
Anonymous
December 23, 2014
@Mad The Category property is only defined in class B and the Enum typecasting is only defined in classes that are first level descendants of class BAnonymous
December 26, 2014
@Thijs: Thanks a lot for reporting this. I was able to repro this. Also, not sure if it was you or someone else, but a bug was filed with a different repro involving TPT inheritance: entityframework.codeplex.com/.../2616. We should have enough information to investigate. We will reply with more information when we have it.Anonymous
December 26, 2014
@Diego Thanks, keep up the good workAnonymous
December 30, 2014
@Thijs could you copy past the base class and the full class which is inheritance it. I'm trying to follow what you have said in your original post and am struggling as I can not see all code in context. As by the sounds of it... I also would of coded it differently.. I would of done something like.... (please post yours so I may learn... as i get the impression that you are wanting something else) public abstract class AbsClass { public abstract int CategoryId {get; set;} } public class EntityA : AbsClass { [NotMapped] public AddressTypes Category { get{return (AddressTypes)base.CategoryId } } }Anonymous
December 31, 2014
@Calvin - The issue in question is only hit when you hide the property on the base type with a property with the same name on the derived type. Your example works fine because the NotMapped property on the derived class has a different name and isn't hiding the property from the base class. More info on the issue is here - entityframework.codeplex.com/.../2616Anonymous
January 07, 2015
I've found that there appears to be something wrong with the query generator in EF 6.1.2. I'm using MySQL. I'm not sure if I would run into the problem if I was using SQL Server. The following query throws an exception stating that the SQL is invalid. If I comment out the line where the DonorCodes property is being assigned, the query works. Also, if I downgrade to 6.1.1, it works. I have ran into the same problem in another application where I had a query that was doing a lot of .Includes(). var q = oleContext.OrderItems.AsQueryable(); OrderItemsRadGrid.DataSource = (from oi in q where oi.ItemTypeCode == "ITEM" orderby oi.Order.CreationTime descending select new { oi.Id, oi.Order.Number, oi.OrderId, oi.Order.CreationTime, oi.Order.Document.Status, VendorName = oi.Order.Vendor.Name, oi.Order.VendorId, oi.Order.VendorId2, AccountCodes = oi.OrderItemAccounts.Select(oia => oia.AccountCode), DonorCodes = oi.OrderItemDonors.Select(oid => oid.DonorCode), VendorInstructions = oi.OrderItemNotes.Where(oin => oin.NoteTypeId == 6).Select(oin => oin.Note), oi.Order.VendorCustomerId, DeliveryRoom = oi.Order.DeliveryRoom.Name, ExtendedCost = oi.UnitPrice * oi.Quantity, oi.VendorItemId, oi.BibInfo.BibId, oi.BibInfo.Bib.Content, }).ToArray()Anonymous
January 09, 2015
@Jon - Could you open an issue for this - entityframework.codeplex.com/.../Create. Can you include the exception/stack trace you are seeing and the full code (including model) to reproduce the issue.Anonymous
January 12, 2015
The comment has been removedAnonymous
January 23, 2015
Definitely looking forward to faster startup time in 7. Maybe the initialization can be parallelized in 7? I have an app that has 1,400 entities in it. It takes about 35 seconds on my desktop, but, more like 3 minutes on the server which is dated.Anonymous
January 26, 2015
@Jon - We haven't done benchmarks and tuning in this area yet... but the simplified metadata system looks to be giving us some good perf improvements.Anonymous
January 26, 2015
@Fernando - We aren't working on that change right now - though it would make a good contribution. There will be some significant improvements in this area in EF7.Anonymous
January 27, 2015
One thing I was thinking of is if it would be possible for EF to lazily initialize the model as needed. I.e. Say I have 1,400 entities, but, a particular app that makes use of the model only uses one entity. Make it so that EF only loads the metadata for that entity and any entities that it references. I'm thinking the fluent API would make this problematic. If it were purely attribute based, I think it would be easier.Anonymous
January 29, 2015
@Jon - We have considered this. It's not clear yet how much it will be needed in EF7. Our metadata model is so much lighter weight that it could be what used to be considered a 'large model' is now fast enough (and uses low enough memory) that lazy initialization becomes irrelevant. As you mentioned, when we are building the model on the fly it can't really be lazily created. Even when using annotations, processing one entity can have an effect on another entity. What we will look at is the ability to compile a model and then lazily load it during runtime.Anonymous
February 10, 2015
I've been running into a problem where some of the queries that are being generated either by EF or EntityDataSource are doing something like the following where it's generating a SELECT in a SELECT. I'm using EntityDataSource with Telerik's RadGrid control for ASP.NET AJAX. Not sure if that has anything to do with it. The page size is 100, so, it's generating a LIMIT expression since I'm using MySQL. However, it's adding the LIMIT at the end and these tables have millions or rows in them. So, it's doing a JOIN on millions of rows, then truncating the results after the fact which ends up in poor performance. I have no idea why nested queries are being generated like this. Any chance this might be fixed in EF 7 or a future version of EF 6? Also, I'm wondering why EntityDataSource is being dropped in EF7? I'm going to need it for my app. Maybe I can get the source from EF 6 and try to update it myself. Not sure how complicated that would be or what the best way to dynamically build queries in EF 7 is. Also, I think that model binding in ASP.NET Web Forms needs to be improved. If I remember correctly, you can't sort on Navigation property properties. For example, say an Order has a Customer. You can't sort on Item.Customer.Name. Even though, you can bind that property to the display. SELECTProject1
.C1
,Project1
.BIB_ID_STR
,Project1
.BIB_ID
,Project1
.TITLE
,Project1
.AUTHOR
,Project1
.PUBLISHER
,Project1
.ISXN
,Project1
.BIB_ID1
,Project1
.FORMER_ID
,Project1
.FAST_ADD
,Project1
.STAFF_ONLY
,Project1
.CREATED_BY
,Project1
.DATE_CREATED
,Project1
.UPDATED_BY
,Project1
.DATE_UPDATED
,Project1
.STATUS
,Project1
.STATUS_UPDATED_BY
,Project1
.STATUS_UPDATED_DATE
,Project1
.UNIQUE_ID_PREFIX
,Project1
.CONTENT
FROM (SELECTExtent1
.BIB_ID_STR
,Extent1
.BIB_ID
,Extent1
.TITLE
,Extent1
.AUTHOR
,Extent1
.PUBLISHER
,Extent1
.ISXN
,Extent2
.BIB_ID
ASBIB_ID1
,Extent2
.FORMER_ID
,Extent2
.FAST_ADD
,Extent2
.STAFF_ONLY
,Extent2
.CREATED_BY
,Extent2
.DATE_CREATED
,Extent2
.UPDATED_BY
,Extent2
.DATE_UPDATED
,Extent2
.STATUS
,Extent2
.STATUS_UPDATED_BY
,Extent2
.STATUS_UPDATED_DATE
,Extent2
.UNIQUE_ID_PREFIX
,Extent2
.CONTENT
, 1 ASC1
FROMole_ds_bib_info_t
ASExtent1
LEFT OUTER JOINole_ds_bib_t
ASExtent2
ONExtent1
.BIB_ID
=Extent2
.BIB_ID
) ASProject1
ORDER BYProject1
.BIB_ID_STR
ASC LIMIT 0,100Anonymous
February 10, 2015
@Jon - Yes, a lot of those nested queries are much simpler in EF7. We probably won't be improving it on EF6.x though because anytime we touch something in query it has a tendency to have ripple effects that end up breaking something in an obscure place for some providers. Whether or not we have Entity Data Source will be driven by customer demand. We'd encourage folks to use model binding instead, but if there is significant demand for scenarios that are best served by a custom data source then we will consider doing it.Anonymous
March 10, 2015
The comment has been removedAnonymous
March 13, 2015
@Luís Oliveira - Here is some documentation on using EF with WinForms msdn.microsoft.com/.../jj682076. If you have specific questions beyond what is covered there, it would be best to ask them on StackOverflow.com (be sure to use the entity-framework tag).