Содержание EF FAQ
EF поддерживает сопоставление хранимых процедур для всех четырех CRUD (Create, Read, Update, and Delete) операций. Для получения более подробной информации и пример того, как получать сущности используя хранимые процедуры посмотрите следующие ссылки:
Для получения доступных только для чтения сущностей используйте Defining Query. Посмотрите Mapping Read-only Entities и Элемент QueryView (язык MSL) для получения более полной информации.
Действительно, когда вы создаете DDL скрипты на основе модели, у вас может возникнуть необходимость настроить создаваемый SQL. Например, у вас есть поле с типом binary в модели которое вы хотите отражать в timestamp или rowversion (начиная с SQL Server 2008 необходимо использовать rowversion вместо timestamp ), сейчас вы не можете сделать это в дизайнере. Вы можете настроить шаблон T4 который создаст нужный вам DDL скрипт следующим образом:
1. Добавьте структурную аннотацию в файл CSDL, объявив новое пространство имен и затем добавив с него новый элемент:
Для получения более подробной информации посмотрите следующую статью http://blogs.msdn.com/b/efdesign/archive/2008/08/12/structural-annotations-one-pager.aspx.
CopyToSSDL указывае��, что в процессе генерации нужно скопировать указанное свойство в SSDL.
Для этого найдите следующий код в файле с расширением .tt:
[<#=Id(prop.Name)#>] <#=prop.ToStoreType()#> <#=WriteIdentity(prop, targetVersion)#> <#=WriteNullable(prop.Nullable)#> <#=(p < entitySet.ElementType.Properties.Count - 1) ? "," : ""#>
И замените его кодом, который считывает аннотацию (если она есть) и использует ее значение вместо предлагаемого по умолчанию в типа в базе данных:
[<#=Id(prop.Name)#>] <# if (prop.MetadataProperties.Contains("http://tempuri.org/DatabaseTypes:databasetype")) { MetadataProperty annotationProperty = prop.MetadataProperties[ "http://tempuri.org/DatabaseTypes:databasetype"]; XElement e = XElement.Parse(annotationProperty.Value.ToString()); string value = e.Value.Trim(); #> <#=value#> <# } else { #> <#=prop.ToStoreType()#> <# } #> <#=WriteIdentity(prop, targetVersion) #> <#=WriteNullable(prop.Nullable) #> <#=(p < entitySet.ElementType.Properties.Count - 1) ? "," : "" #>
Замечание: Чтобы заставить приведенный код работать нужно добавить несколько сборок и пространств имен:
<#@ assembly name="System.Xml.Linq" #> <#@ assembly name="System.Xml" #> <#@ import namespace="System.Xml.Linq" #> <#@ import namespace="System.Xml" #>
Эта ошибка может возникать до тех пор пока вы не сгенерировали таблицу на основе модели при разработке “Модель сначала”. Модель не может быть проверена до тех пор, пока все объекты в ней не сопоставляются с таблицами в базе данных. После того, как вы создадите БД на основе модели, ошибка должна исчезнуть.
Вы должны добавить условие для колонки Active в вашем типе сущности. Затем нужно удалить сопоставление для колонки Active после чего совсем удалить ее из типа(именно в этом порядке). Рассмотрим следующий пример. Например у нас есть тип Entity2 у которое есть свойство Active. Это свойство типа bit в SQL Server.
Нам нужно добавить условие, которое указывает, что нужно получать данные только когда Active = 1, очистите сопоставление, затем удалите свойство из Entity2, как показано на следующем рисунке.
Теперь, вы будет получать записи у которых Active будет установлено в 1.
foreach (var e in context.Entity2) Console.WriteLine(e.ID);
При этом, в клиентском приложении вам нужно будет добавить логику, которая будет устанавливать значение колонки Active в ноль, вместо удаления. Это можно сделать при помощи примерно такого кода:
public override int SaveChanges(SaveOptions options)
{
foreach (ObjectStateEntry entry in ObjectStateManager.GetObjectStateEntries(
EntityState.Deleted))
// Change the status to Unchanged, since we don't want for the Entity Framework
// to issue a delete command.
Entity2 e = entry.Entity as Entity2;
entry.ChangeState(EntityState.Unchanged);
// Update the Active columns in the database.
ExecuteStoreCommand("UPDATE Entity2 SET Active = 0 WHERE Entity2.ID = {0}", e.ID);
}
return base.SaveChanges(options);
Да. Entity Framework поддерживает сопоставление представлений в сложные типы. На самом деле представления не сильно отличаются от таблиц, но EF не имеет полной информации о них, в смысле ничего не знает о ключевых полях и тд. Обратите внимание, что сложные типы тоже не могут иметь ключей. Ключи могут быть созданы на основе одного или нескольких полей простых типов.
Если вы установите свойство StoreGeneratedPattern в значение Identity (если значение рассчитывается один раз, при добавлении записи в базу данных) или Computed (если значение рассчитывается при каждом обновлении записи), по при вызове метода SaveChanges EF получит рассчитываемое в БД значение и обновит объект. EF не будет автоматически обновлять значение при создании нового объекта, потому что значение рассчитывается в базе данных.
Следует заметить, что свойство StoreGeneratedPattern доступно в свойствах сущностей дизайнера EDM, только если вы использует подход “Модель сначала”. Если вы создаете модель из базы данных, то вам нужно будет самим обновить секцию SSDL файла EDMX добавив атрибут StoreGeneratedPattern в свойства сущности. Это будет исправлено в следующих выпусках дизайнера EF и свойство будет доступно и при разработке “Модель сначала” и “База данных сначала”.
Нет.
Richard Mueller edited Revision 1. Comment: Fix TOC