Entity Framework - постоянство
Entity Framework теперь позволяет вам использовать Entity Framework, не заставляя каждую часть вашего приложения знать о Entity Framework, отделяя сущности от инфраструктуры. Вы можете создавать классы, которые могут сосредоточиться на своих бизнес-правилах, независимо от того, как они сохраняются (где хранятся данные и как данные передаются между вашими объектами).
Создание стойких невежественных сущностей
В предыдущем абзаце описан метод, который не знает источника данных, которые он потребляет. Это подчеркивает сущность игнорирования персистентности, когда ваши классы и многие из слоев нашего приложения вокруг них не заботятся о том, как хранятся данные.
В версии Entity Framework для .NET 3.5, если вы хотели использовать уже существующие классы, вам нужно было изменить их, заставив наследовать их от EntityObject.
В .NET 4 это больше не нужно. Вам не нужно изменять свои сущности, чтобы они могли участвовать в операциях Entity Framework.
Это позволяет нам создавать приложения, которые учитывают слабую связь и разделение задач.
С этими шаблонами кодирования ваши классы связаны только с их собственными заданиями, и многие уровни вашего приложения, включая пользовательский интерфейс, не зависят от внешней логики, такой как API-интерфейсы Entity Framework, однако эти внешние API-интерфейсы могут взаимодействовать с нашими сущности.
Есть 2 способа (подключенный и отключенный) при сохранении сущности с помощью Entity Framework. Оба пути имеют собственное значение. В случае подключенного сценария изменения отслеживаются контекстом, но в случае отключенного сценария нам необходимо сообщить контексту о состоянии объекта.
Связанные сценарии
Связанный сценарий - это когда объект извлекается из базы данных и изменяется в том же контексте. Для связанного сценария предположим, что у нас есть служба Windows и мы выполняем некоторые бизнес-операции с этой сущностью, поэтому мы откроем контекст, переберем все сущности, выполним наши бизнес-операции, а затем сохраним изменения в том же контексте, что и мы. открылся в начале.
Давайте посмотрим на следующий пример, в котором студенты извлекаются из базы данных и обновляют имена студентов, а затем сохраняют изменения в базе данных.
class Program {
static void Main(string[] args) {
using (var context = new MyContext()) {
var studentList = context.Students.ToList();
foreach (var stdnt in studentList) {
stdnt.FirstMidName = "Edited " + stdnt.FirstMidName;
}
context.SaveChanges();
//// Display all Students from the database
var students = (from s in context.Students
orderby s.FirstMidName select s).ToList<Student>();
Console.WriteLine("Retrieve all Students from the database:");
foreach (var stdnt in students) {
string name = stdnt.FirstMidName + " " + stdnt.LastName;
Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
}
Console.ReadKey();
}
}
}
Когда приведенный выше код скомпилирован и выполнен, вы получите следующий вывод, и вы увидите, что отредактированное слово добавлено перед первым именем, как показано в следующем выводе.
Retrieve all Students from the database:
ID: 1, Name: Edited Edited Alain Bomer
ID: 2, Name: Edited Edited Mark Upston
Отключенные сценарии
Сценарий отключения - это когда объект извлекается из базы данных и изменяется в другом контексте. Предположим, мы хотим отобразить некоторые данные на уровне представления и используем какое-то n-уровневое приложение, поэтому было бы лучше открыть контекст, получить данные и, наконец, закрыть контекст. Поскольку здесь мы извлекли данные и закрыли контекст, извлеченные нами объекты больше не отслеживаются, и это сценарий отключения.
Давайте посмотрим на следующий код, в котором новая отключенная сущность Student добавляется в контекст с помощью метода Add.
class Program {
static void Main(string[] args) {
var student = new Student {
ID = 1001,
FirstMidName = "Wasim",
LastName = "Akram",
EnrollmentDate = DateTime.Parse( DateTime.Today.ToString())
};
using (var context = new MyContext()) {
context.Students.Add(student);
context.SaveChanges();
//// Display all Students from the database
var students = (from s in context.Students
orderby s.FirstMidName select s).ToList<Student>();
Console.WriteLine("Retrieve all Students from the database:");
foreach (var stdnt in students) {
string name = stdnt.FirstMidName + " " + stdnt.LastName;
Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
}
Console.ReadKey();
}
}
}
Когда приведенный выше код скомпилирован и выполнен, вы получите следующий вывод.
Retrieve all Students from the database:
ID: 1, Name: Edited Edited Edited Alain Bomer
ID: 2, Name: Edited Edited Edited Mark Upston
ID: 3, Name: Wasim Akram