Ignorowanie właściwości klasy w Kodeksie Entity Framework 4.1 Najpierw

299

Rozumiem, że [NotMapped]atrybut nie jest dostępny, dopóki EF 5 nie jest obecnie w CTP, więc nie możemy go użyć w produkcji.

Jak oznaczyć właściwości w EF 4.1, które mają być ignorowane?

AKTUALIZACJA: Zauważyłem coś jeszcze dziwnego. Mam [NotMapped]atrybut do pracy, ale z jakiegoś powodu EF 4.1 nadal tworzy kolumnę o nazwie Disposed w bazie danych, mimo że public bool Disposed { get; private set; }jest oznaczony [NotMapped]. Klasa implementuje IDisposeableoczywiście, ale nie rozumiem, jak to powinno mieć znaczenie. jakieś pomysły?

Raheel Khan
źródło
Wydaje mi się, że powinien on również mieć zastosowanie do Entity Framework 4.1. Sprawdź ten link: social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/…
ilmatte
1
@SamLeach: Przeczytałem już to pytanie przed opublikowaniem własnego i nie znalazłem rozwiązania. Pytanie brzmi: jak to osiągnąć w EF4? Czy coś przeoczyłem w tym poście?
Raheel Khan
Tak też myślałem, ponieważ mam EF 4.1 i widzę ten atrybut. Ale EF wydaje się być całkiem szczęśliwy, że mogę go całkowicie zignorować w moich aplikacjach. Dotyczy to rodzimych i referencyjnych typów, a także typów referencyjnych, takich jak aplikacje intrerop MS Office.
Raheel Khan
Przepraszam, ale zrobiłem teraz test z prostą aplikacją i działa. Czy możesz podać przykładowy kod?
ilmatte

Odpowiedzi:

594

Możesz użyć NotMappedadnotacji danych atrybutów, aby poinstruować Code-First o wykluczeniu określonej właściwości

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]atrybut jest zawarty w System.ComponentModel.DataAnnotationsprzestrzeni nazw.

Alternatywnie możesz to zrobić za pomocą funkcji Fluent APInadpisywania OnModelCreatingw swojej DBContextklasie:

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

Sprawdzona wersja EF 4.3to najnowsza stabilna wersja dostępna podczas korzystania z NuGet.


Edycja : wrz 2017

Asp.NET Core (2.0)

Adnotacja danych

Jeśli używasz asp.net core ( 2.0 w momencie pisania tego tekstu ), [NotMapped]atrybutu można użyć na poziomie właściwości.

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

Płynne 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
źródło
3
Dzięki. Zawsze dobrze jest widzieć odpowiedzi z wysiłkiem za nimi. Właściwie nie zauważyłem twojej ostatniej linii przed zaznaczeniem kolejnej odpowiedzi jako poprawnej. Ponieważ twoja odpowiedź nadeszła wcześniej, myślę, że sprawiedliwie jest zmienić twoją odpowiedź na poprawną. Jestem pewien, że @ilmatte nie będzie miał nic przeciwko.
Raheel Khan
13
W wersji 5> EF są one teraz dostępne w System.ComponentModel.DataAnnotations.Schema
Daveo
kiedy używam FluentMApping, pole jest nadal zwracane w zestawie wyników, chociaż NULL wie. Jak mogę go nawet nie zwrócić?
Rodney
8
Użycie [NotMapped] powie również innym serializatorom (na przykład JSON / XML), aby nie mapowali tej właściwości. Jeśli chcesz tylko zapobiec odwzorowaniu na tabelę bazy danych, ale nadal masz dostęp do właściwości przez serializatory, musisz użyć metody OnModelCreating.
maxmantz
Chociaż nie wiem dokładnie, jak to zrobić, nie działa to z właściwościami odziedziczonymi po strukturze encji 6+, atrybut i płynne API wydają się ignorować instrukcję
PBo
35

Począwszy od wersji 5.0, musisz uwzględnić System.ComponentModel.DataAnnotations.Schemaprzestrzeń nazw.

Shane
źródło
2
Czy nadal tak jest? Używam EF 6.0 i tak już nie jest, przynajmniej nie w przypadku mojego projektu. Chyba że odwołałem się do przestrzeni nazw, która już gdzieś odwołuje się do powyższego.
JARRRRG