📜 ⬆️ ⬇️

Another look at the Entity Framework: performance and pitfalls

It's no secret that the adaptation of the Entity Framework is very slow. A huge number of companies continue to use Linq2Sql and do not plan to change it to something new in the foreseeable future, despite the fact that EF is the officially recommended database access technology by Microsoft, and Linq2Sql is almost not supported.

Those who still doubt whether it is possible to use EF (and especially - code first) on real projects, I invite under kat.

Introduction


Firstly, if you already have a couple of completed projects using EF, you can stop reading. It is unlikely that you will learn something new.

Despite the fact that there will be quite a few references to Linq2Sql below, the post is not a direct comparison of technologies. I simply do not know Linq2Sql well enough to adequately compare it with anything.
')
This is not an optimization manual, although some recommendations will be given. Useful material can be found here or here . Also, optimization methods through hand-written SQL-code will not be considered, although sooner or later it will have to be written in any more or less large project.

The post assumes at least a general acquaintance with the Entity Framework Code First, SQL and in general the principles of ORM.

The current version of EF at the time of writing is EF5. For maximum performance , .NET 4.5 was used. Everything said below relates primarily to Code First with automatic database generation (which is actively advertised by Microsoft employees themselves). The database server is LocalDb (usually it works slower than a full-fledged MS SQL Server).

The test code is available on GitHub .

Data model


For the demonstration a very simplified model of correspondence will be used. Strictly speaking, knowledge of the model is not required to understand the following examples, but will not be harmful.

Each user ( Account ) has several folders with letters ( MessageFolder ). Each folder contains several message chains ( MessageThread ), while one chain can be in multiple folders at the same time ( ThreadsInFolders ). Each thread consists of many letters. In this case, the chains are rummaging between accounts, letters - no.

Of course, a model in such a form can hardly be used in real code (although, undoubtedly, something in the spirit can occur), but it was the first small, but rather complex for our experiments, system that came to my mind. Excuse me.

She's in the code.
 public class Account { public int Id { get; set; } [Required] public string Name { get; set; } } public class Message { public int Id { get; set; } public bool IsRead { get; set; } public DateTime Date { get; set; } public string Text { get; set; } [Required] public virtual MessageThread Thread { get; set; } [Required] public virtual Account Owner { get; set; } [Required] public virtual Account Sender { get; set; } [Required] public virtual Account Receiver { get; set; } } public class MessageThread { public int Id { get; set; } [Required] [StringLength(150)] public string Subject { get; set; } public virtual ICollection<MessageFolder> Folders { get; set; } } public class MessageFolder { public int Id { get; set; } public string Name { get; set; } [Required] public Account Owner { get; set; } public virtual ICollection<MessageThread> Threads { get; set; } } 

Reading data


The most important thing in any ORM system is reading data. There is no problem with EF - queries to the database are fun and playful, lazy loading is supported. All loaded objects fall into the internal context cache, then they can be requested directly from it (only through the Find method).

A simple query will look something like this:
 context.Messages.AsNoTracking().OrderBy(f => f.Id).Take(count) .Include(f => f.Owner).Include(f => f.Sender).Include(f => f.Receiver) .ToList(); 

SQL
 SELECT TOP (100) [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent2].[Id] AS [Id1], [Extent2].[Name] AS [Name], [Extent3].[Id] AS [Id2], [Extent3].[Name] AS [Name1], [Extent4].[Id] AS [Id3], [Extent4].[Name] AS [Name2] FROM [dbo].[Message] AS [Extent1] INNER JOIN [dbo].[Account] AS [Extent2] ON [Extent1].[Owner_Id] = [Extent2].[Id] INNER JOIN [dbo].[Account] AS [Extent3] ON [Extent1].[Sender_Id] = [Extent3].[Id] INNER JOIN [dbo].[Account] AS [Extent4] ON [Extent1].[Receiver_Id] = [Extent4].[Id] ORDER BY [Extent1].[Id] ASC 

AsNoTracking disables EF tracking of received objects (they will not be cached); Include - loads the specified related entities (navigation property / navigation properties) through the generation, most often, INNER JOIN ; the rest is LINQ familiar to everyone.

The most interesting point here is Include . Strictly speaking, the final realization of what you may need occurs at the presentation level, so the most logical arrangement of all Include is there, or at the neighboring level (for example, controllers in MVC). In fact, this means that you have to drag IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
   IQueryable    ,  ,     ,   Linq2Entities,     .    (--)    . ,      extension methods  IQueryable   ,    . 

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
   IQueryable    ,  ,     ,   Linq2Entities,     .    (--)    . ,      extension methods  IQueryable   ,    . 

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .

IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .

IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
  1. IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

    Find
    . Find , . , context.Messages.Find(1) , . . , .
    context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
    SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
    context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

    , , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

    : 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


    . Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

    :
    ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
    StackOverflow .
    EF , ( ) Linq2Sql. , , Linq2Sql.


    .NET ORM-. Bulk-. , SQL , ORM .
    , . EF :
    var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
    SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
    -, , . , , , – . , , . .

    update/delete . , .

    EntityFramework.Extended :
    var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
    SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
    . , SaveChanges – SQL . , - , /.

    , , dynamic ( , , IntelliTrace), . (EntityFramework ).
    10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
    , EntityFramework.Extended , . .

    navigation property
    – . « !» :
    var count = folder.Threads.Count();
    , navigation properties, , SQL.
    SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
    EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
    var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
    SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
    , , , , , « ».


    – , .

    :
    Response.Cache.SetLastModified(lastUpdated);
    lastUpdated – , .
    , ASP.NET MVC ToUniversalTime() , :
    if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
    – , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

    EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

    RequiredAttribute
    EF.

    , Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

    , -, ?
    var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
    , - . DbEntityValidationException .

    RequiredAttribute , null, . , , .

    : (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

    (tl;dr)
    EF - ? . , Microsoft - EF.

    , EF , , . , , , EF.

    EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

    , , - Entity Framework. // , . .
  2. IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

    Find
    . Find , . , context.Messages.Find(1) , . . , .
    context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
    SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
    context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

    , , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

    : 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


    . Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

    :
    ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
    StackOverflow .
    EF , ( ) Linq2Sql. , , Linq2Sql.


    .NET ORM-. Bulk-. , SQL , ORM .
    , . EF :
    var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
    SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
    -, , . , , , – . , , . .

    update/delete . , .

    EntityFramework.Extended :
    var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
    SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
    . , SaveChanges – SQL . , - , /.

    , , dynamic ( , , IntelliTrace), . (EntityFramework ).
    10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
    , EntityFramework.Extended , . .

    navigation property
    – . « !» :
    var count = folder.Threads.Count();
    , navigation properties, , SQL.
    SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
    EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
    var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
    SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
    , , , , , « ».


    – , .

    :
    Response.Cache.SetLastModified(lastUpdated);
    lastUpdated – , .
    , ASP.NET MVC ToUniversalTime() , :
    if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
    – , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

    EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

    RequiredAttribute
    EF.

    , Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

    , -, ?
    var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
    , - . DbEntityValidationException .

    RequiredAttribute , null, . , , .

    : (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

    (tl;dr)
    EF - ? . , Microsoft - EF.

    , EF , , . , , , EF.

    EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

    , , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .

IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .

IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
   IQueryable    ,  ,     ,   Linq2Entities,     .    (--)    . ,      extension methods  IQueryable   ,    . 

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
   IQueryable    ,  ,     ,   Linq2Entities,     .    (--)    . ,      extension methods  IQueryable   ,    . 

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
   IQueryable    ,  ,     ,   Linq2Entities,     .    (--)    . ,      extension methods  IQueryable   ,    . 

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
   IQueryable    ,  ,     ,   Linq2Entities,     .    (--)    . ,      extension methods  IQueryable   ,    . 

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .

IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .

IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
   IQueryable    ,  ,     ,   Linq2Entities,     .    (--)    . ,      extension methods  IQueryable   ,    . 

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
   IQueryable    ,  ,     ,   Linq2Entities,     .    (--)    . ,      extension methods  IQueryable   ,    . 

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
   IQueryable    ,  ,     ,   Linq2Entities,     .    (--)    . ,      extension methods  IQueryable   ,    . 

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
   IQueryable    ,  ,     ,   Linq2Entities,     .    (--)    . ,      extension methods  IQueryable   ,    . 

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .

IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .

IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
   IQueryable    ,  ,     ,   Linq2Entities,     .    (--)    . ,      extension methods  IQueryable   ,    . 

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
   IQueryable    ,  ,     ,   Linq2Entities,     .    (--)    . ,      extension methods  IQueryable   ,    . 

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .

IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .

IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
   IQueryable    ,  ,     ,   Linq2Entities,     .    (--)    . ,      extension methods  IQueryable   ,    . 

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .
IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .

IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .

IQueryable , , , Linq2Entities, . (--) . , extension methods IQueryable , .

Find
. Find , . , context.Messages.Find(1) , . . , .
context.Accounts.Load(); // - var m = context.Messages.First(); Console.WriteLine(m.Owner.Name);
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name] FROM [dbo].[Account] AS [Extent1] GO SELECT TOP (1) [c].[Id] AS [Id], [c].[IsRead] AS [IsRead], [c].[Date] AS [Date], [c].[Text] AS [Text], [c].[Thread_Id] AS [Thread_Id], [c].[Owner_Id] AS [Owner_Id], [c].[Sender_Id] AS [Sender_Id], [c].[Receiver_Id] AS [Receiver_Id] FROM [dbo].[Message] AS [c]
context.Messages.Include(f=>f.Owner).First() . : Include SQL-, .

, , , , context.Set().Local, , . SaveChanges . . Linq2Sql.

: 1000 EF 2-3 , Linq2Sql. , API , Linq2Sql .


. Add Added . SubmitChanges , INSERT . navigation property, , Added ( ).

:
ValidateOnSaveEnabled AutoDetectChangesEnabled . . . , GC . , 100 .
StackOverflow .
EF , ( ) Linq2Sql. , , Linq2Sql.


.NET ORM-. Bulk-. , SQL , ORM .
, . EF :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); foreach (var m in messages) m.IsRead = true; context.SaveChanges();
SQL SELECT [Extent1].[Id] AS [Id], [Extent1].[IsRead] AS [IsRead], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Thread_Id] AS [Thread_Id], [Extent1].[Owner_Id] AS [Owner_Id], [Extent1].[Sender_Id] AS [Sender_Id], [Extent1].[Reciever_Id] AS [Reciever_Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 update [dbo].[Message] set [IsRead] = @0 where ([Id] = @1) --(N )
-, , . , , , – . , , . .

update/delete . , .

EntityFramework.Extended :
var messages = context.Messages.Where(f=>f.Thread.Id == threadId); messages.Update(f => new Message {IsRead = true});
SQL UPDATE [dbo].[Message] SET [IsRead] = @p__update__0 FROM [dbo].[Message] AS j0 INNER JOIN ( SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Message] AS [Extent1] WHERE [Extent1].[Thread_Id] = @p__linq__0 ) AS j1 ON (j0.[Id] = j1.[Id])
. , SaveChanges – SQL . , - , /.

, , dynamic ( , , IntelliTrace), . (EntityFramework ).
10 , 10000 , EntityFramework 8 935 EntityFramework.Extended 28 83
, EntityFramework.Extended , . .

navigation property
– . « !» :
var count = folder.Threads.Count();
, navigation properties, , SQL.
SQL SELECT [Extent2].[Id] AS [Id], [Extent2].[Subject] AS [Subject] FROM [dbo].[ThreadsInFolders] AS [Extent1] INNER JOIN [dbo].[MessageThread] AS [Extent2] ON [Extent1].[MessageThread_Id] = [Extent2].[Id] WHERE [Extent1].[MessageFolder_Id] = @EntityKeyValue1
EF, Linq2Sql, Count() , Any() , , navigation property, . , «» . , , :
var count = context.Threads.Count(f => f.Folders.Any(e => e.Id == folder.Id)));
SQL SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[MessageThread] AS [Extent1] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[ThreadsInFolders] AS [Extent2] WHERE ([Extent1].[Id] = [Extent2].[MessageThread_Id]) AND ([Extent2].[MessageFolder_Id] = @p__linq__0) ) ) AS [GroupBy1]
, , , , , « ».


– , .

:
Response.Cache.SetLastModified(lastUpdated);
lastUpdated – , .
, ASP.NET MVC ToUniversalTime() , :
if (utcDate > DateTime.UtcNow) { throw new ArgumentOutOfRangeException("utcDate"); }
– , DateTime Kind DateTimeKind.Undefined ( , , - UTC ). , , ( DateTimeKind ), ToUniversalTime() ToLocalTime() . , GMT - N.

EF, Linq2Sql , , . , code first . ObjectMaterialized ( ) . DateTime , ComplexType , reference type.

RequiredAttribute
EF.

, Owner , Sender , Receiver Thread Required . -, , NOT NULL , -, EF.

, -, ?
var message = context.Messages.Find(1); message.IsRead = true; context.SaveChanges();
, - . DbEntityValidationException .

RequiredAttribute , null, . , , .

: (), (), try-catch SaveChanges catch (), , (), RequiredAttribute NOT NULL Fluent API. , , , , , ( Required null UPDATE ). , , .

(tl;dr)
EF - ? . , Microsoft - EF.

, EF , , . , , , EF.

EF Linq2Sql? , , . code first ( ), . , ( EF6 ). -- ( , ) .. ORM- EF – .

, , - Entity Framework. // , . .

Source: https://habr.com/ru/post/164483/


All Articles