Игнорирование свойства класса в Entity Framework 4.1 Code First

299

Насколько я понимаю, этот [NotMapped]атрибут недоступен до EF 5, который в настоящее время находится в CTP, поэтому мы не можем использовать его в производстве.

Как пометить свойства в EF 4.1, чтобы они игнорировались?

ОБНОВЛЕНИЕ: я заметил кое-что еще странное. Я получил [NotMapped]атрибут для работы, но по какой-то причине EF 4.1 все еще создает столбец с именем Disposed в базе данных, даже если public bool Disposed { get; private set; }он помечен значком [NotMapped]. IDisposeableКонечно, класс реализует, но я не понимаю, как это должно иметь значение. Есть предположения?

Рахил Хан
источник
Мне кажется, что это должно относиться и к Entity Framework 4.1. Проверить эту ссылку: social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/...
ilmatte
1
@SamLeach: я уже прочитал этот вопрос, прежде чем опубликовать свой собственный, и не нашел решения. Вопрос в том, как добиться того же в EF4? Я что-то пропустил в этом посте?
Рахил Хан
Я тоже так думал, так как у меня есть EF 4.1 и я вижу атрибут. Но EF кажется вполне счастливым, чтобы полностью игнорировать это в моих приложениях. Это относится к родным и ссылочным типам, а также к ссылочным типам com, таким как приложения MS Office Intrerop
Рахил Хан
Извините, но я сделал тест прямо сейчас с простым приложением, и оно работает. Не могли бы вы предоставить пример кода?
ilmatte

Ответы:

594

Вы можете использовать NotMappedаннотацию данных атрибута для указания Code-First исключить конкретное свойство

public class Customer
{
    public int CustomerID { set; get; }
    public string FirstName { set; get; } 
    public string LastName{ set; get; } 
    [NotMapped]
    public int Age { set; get; }
}

[NotMapped]атрибут включен в System.ComponentModel.DataAnnotations пространство имен.

В качестве альтернативы вы можете сделать это с помощью Fluent APIпереопределяющей OnModelCreatingфункции в вашем DBContextклассе:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<Customer>().Ignore(t => t.LastName);
   base.OnModelCreating(modelBuilder);
}

http://msdn.microsoft.com/en-us/library/hh295847(v=vs.103).aspx

Я проверил версию EF 4.3, которая является последней стабильной версией, доступной при использовании NuGet.


Изменить : сентябрь 2017

Asp.NET Core (2.0)

Аннотация данных

Если вы используете ядро ​​asp.net ( 2.0 на момент написания этой статьи ), [NotMapped]атрибут можно использовать на уровне свойств.

public class Customer
{
    public int Id { set; get; }
    public string FirstName { set; get; } 
    public string LastName { set; get; } 
    [NotMapped]
    public int FullName { set; get; }
}

Свободный API

public class SchoolContext : DbContext
{
    public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Customer>().Ignore(t => t.FullName);
        base.OnModelCreating(modelBuilder);
    }
    public DbSet<Customer> Customers { get; set; }
}
Shyju
источник
3
Спасибо. Всегда приятно видеть ответы с усилиями за ними. Я на самом деле не заметил твою последнюю строку, прежде чем пометить другой ответ как правильный. Так как ваш ответ пришел раньше, я думаю, что было бы справедливо изменить ваш ответ на правильный. Я уверен, что @ilmatte не будет возражать.
Рахил Хан
13
С v5> EF они теперь живут в System.ComponentModel.DataAnnotations.Schema
Daveo
когда я использую FluentMApping, поле все еще возвращается в наборе результатов, хотя оно и равно NULL. Как мне заставить его даже не возвращаться?
Родни
8
Использование [NotMapped] также скажет другим сериализаторам (например, JSON / XML) не отображать это свойство. Если вы хотите только предотвратить отображение в таблицу базы данных, но при этом сериализаторы имеют доступ к свойству, вы должны использовать подход OnModelCreating.
maxmantz
Хотя я точно не выяснил, как это сделать, это не работает со свойствами, унаследованными в Entity Framework 6+, но атрибут и свободный API, кажется, игнорируют инструкцию
PBo
35

Начиная с EF 5.0, вам необходимо включить System.ComponentModel.DataAnnotations.Schemaпространство имен.

Шейн
источник
2
Это все еще так? Я использую EF 6.0, и это больше не относится к моему проекту. Если я не ссылаюсь на пространство имен, которое уже где-то ссылается на вышеприведенное.
JARRRRG