Ігнорування властивості класу в Entity Framework 4.1 Перший код


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 здається цілком щасливим, що повністю ігнорує це у своїх програмах. Це стосується як рідних, так і довідкових типів, а також типів посилань, таких як 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.


Редагувати : SEP 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; }
}

3
Дякую. Завжди добре бачити відповіді з зусиллям за ними. Я фактично не помітив вашого останнього рядка, перш ніж позначити іншу відповідь правильною. Оскільки ваша відповідь була раніше, я думаю, що справедливо змінити свою на правильну. Я впевнений, що @ilmatte не буде проти.
Рахіль Хан

13
З v5> з EF вони зараз живуть у System.ComponentModel.DataAnnotations.Schema
Daveo

коли я використовую FluentMApping, поле все одно повертається у наборі результатів, хоча це НУЛЬНЕ знаю. Як змусити його навіть не повернутись?
Родні

8
Використання [NotMapped] також скаже іншим серіалізаторам (наприклад, JSON / XML), щоб не відображати цю властивість. Якщо ви хочете лише запобігти відображенню в таблиці бази даних, але все ще маєте доступ до ресурсу серіалізаторів, вам потрібно скористатися підходом OnModelCreating.
maxmantz

Хоча я точно не зрозумів, як це, це не працює з властивостями, успадкованими на структурі сутності 6+, атрибут і вільне api, здається, ігнорують інструкцію
PBo

35

Станом на EF 5.0 вам потрібно включити System.ComponentModel.DataAnnotations.Schemaпростір імен.


2
Це все-таки так? Я використовую EF 6.0, і це вже не так, принаймні, не для мого проекту. Якщо я не посилався на простір імен, який вже десь посилається на вище.
JARRRRG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.