2015-06-04 31 views
9

Jest to podobne do pytań here i here, ale te są stare i nie mają dobrych odpowiedzi.Najpierw kod Entity Framework: ignorowanie klas

Powiedzmy mam następujące klasy:

class HairCutStyle { 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

class CustomerHairCutPreference { 
    public int ID { get; set; } 
    public Customer Customer { get; set; } 
    public HairCutStyle HairCutStyle { get; set; } 
} 

Powiedzmy moje dane HairCutStyle są przechowywane w tabeli w innej bazie danych (mogę to od samego Paul Mitchell). Chcę użyć klasy HairCutStyle jako klasy POCO - czegoś, co będę używał w kodzie do reprezentowania fryzur, ale nie potrzebuję czytać/pisać tych informacji w mojej bazie danych. (Zakładam, że mam osobną warstwę usługi, która może zapełniać dane dla tych klas z innej bazy danych.)

Jak mogę powiedzieć, że EF NOT tworzy tabelę HairCutStyle w moim bieżącym kontekście db? Ale jednocześnie chcę zapisać wartość w tabeli CustomerHairCutPreference, która jest odniesieniem do danych HairCutStyle przechowywanych gdzie indziej. "Wirtualny" klucz obcy sortowania, który nie jest ograniczony przez faktyczne ograniczenie FK bazy danych.

+2

Czy próbowałeś nie dodawać go do swojej klasy DbContext? To powinno oznaczać, że EF nie ma wiedzy na temat pliku. – krillgar

+2

Prawdopodobny duplikat. http://stackoverflow.com/questions/7642205/how-to-configure-ef-code-first-to-not-map-a-specific-type –

Odpowiedz

5

Są trzy rzeczy, aby zapewnić:

  1. Upewnij się, że nie narazić DbSet<HairCutStyle> w DbContext pochodzące z A klasy
  2. Upewnij się, że nie ma żadnej wzmianki o HairCutStyle w swoim OnModelCreating zastąp:
  3. Oznacz swoją właściwość HairCutStyle za pomocą atrybutu NotMapped.
18

Dodaj właściwość w CustomerHairCutPreference dla HairCutSytleID, a następnie użyj atrybutu [NotMapped] we właściwości HairCutStyle. Pamiętaj jednak, że będziesz odpowiedzialny za upewnienie się, że HairCutStyle i HairCutStyleID pozostają zsynchronizowane.

class CustomerHairCutPreference { 
    public int ID { get; set; } 
    public Customer Customer { get; set; } 
    public int HairCutStyleID {get; set; } 

    [NotMapped] 
    public HairCutStyle HairCutStyle { get; set; } 
} 

Alternatywnie, można użyć FluentAPI wykluczyć HairCutStyle całkowicie od zawsze są odwzorowywane przez Entity Framework, które mogą być przydatne, jeśli masz kilka klas, które link do niego.

protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
    modelBuilder.Ignore<HairCutStyle>(); 
}