Вопрос по c#, entity-framework-4.1, entity-framework, ef-code-first, .net – Игнорирование свойства класса в Entity Framework 4.1 Code First

280

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

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

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

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

Ваш Ответ

2   ответа
33

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

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

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.

Edit : SEP 2017

Asp.NET Core(2.0)

Data annotation

Если вы используете ядро asp.net (2.0 at the time of this writing), The[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; }
}

Fluent 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; }
}
Хотя я точно не выяснил, как это сделать, это не работает со свойствами, унаследованными в Entity Framework 6+. Атрибут и свободный API, кажется, игнорируют инструкцию.
Использование [NotMapped] также скажет другим сериализаторам (например, JSON / XML) не отображать это свойство. Если вы хотите предотвратить отображение только в таблицу базы данных, но при этом сериализаторы имеют доступ к свойству, вы должны использовать подход OnModelCreating.
Благодарю. Всегда приятно видеть ответы с усилиями за ними. Я на самом деле не заметил твою последнюю строку, прежде чем пометить другой ответ как правильный. Так как ваш ответ пришел раньше, я думаю, что было бы справедливо изменить ваш ответ на правильный. Я уверен, что @ilmatte не возражает. Raheel Khan
С версией 5 & gt; EF они теперь живут в System.ComponentModel.DataAnnotations.Schema
когда я использую FluentMApping, поле все еще возвращается в наборе результатов, хотя оно и равно NULL. Как мне заставить его даже не возвращаться?

Похожие вопросы