33

Najpierw łamiemy kod struktury encji. Zgodnie z konwencją nazewnictwa, musimy teraz nazwać nasze tabele w liczbie mnogiej, aby nie ingerować w narzędzie. Wiem, że mapowania mogą być pojechane. Moje pytanie brzmi: po latach podążania za pojedynczą konwencją nazewnictwa wracamy do używania wielu nazw?Entity Framework Code Pierwsze konwencje nazewnictwa - powrót do tabel w liczbie mnogiej?

Zastanawiam się również, dlaczego nowe przykłady używają Northwind zamiast Adventure Works. Myślę, że to dlatego, bo AW wykorzystuje pojedynczą nazewnictwa i nie będzie w stanie popisywać się żaden kod wyposażony

Odpowiedz

68

Wersja RTM od kod najpierw będzie w pełni wspierać fajna funkcja o nazwie Pluggable Konwencje gdzie możesz dodać lub zamienić domyślne konwencje, takie jak wspomniana.

Na szczęście to, czego szukasz, jest już zawarte w CTP5. Możesz wyłączyć konwencję nazw tabel pluralizujących, usuwając konwencję PluralizingTableNameConvention. To jest cały kod trzeba napisać o tej sprawie:

using System.Data.Entity.ModelConfiguration.Conventions.Edm.Db; 

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{  
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
} 


o swoim secound pytaniach powodu więcej zobacz baza danych Northwind niż Adventure Works to tylko dlatego AW jest ogromny i Northwind jest dość mały baza danych sprawia, że ​​jest lepiej dopasowana do próbek i poradników. Mimo to nadal musisz napisać kod do pracy z bazą danych Northwind w Code First.

+0

Wiedziałem, że mogę zastąpić konwencje z comething jak modelBuilder.Entity (). ToTable ("ApplicationUser") ;. Zastanawiam się tylko, czy pojedyncze nazywanie tabel jest nadal "w". –

+0

Co powiedziałeś, że używasz płynnego API i to jest * NIE * co rozumiem przez * wyłączanie konwencji *. Możemy po prostu wyłączyć konwencję * całkowicie * dla naszej aplikacji przez * Konwencje wtykowe *. Zaktualizowałem moją odpowiedź, aby wyjaśnić. –

+2

Dziękuję za wyjaśnienie i przykład. Czuję, że piję z firehose pomiędzy EF CodeFirst i MVC 3! –

1

Próbowałem i jest jak EF4 CTP5 całkowicie go ignoruje. Co może być nie tak?

użyciu sekcja:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 
using System.Data.Entity; 
using System.Data.Entity.ModelConfiguration; 
using System.Data.Entity.ModelConfiguration.Conventions.Edm; 

DbContext:

public class SiteDataContext : DbContext 
    { 
     public DbSet<Blog> Blogs { get; set; } 
     public DbSet<BlogFeedback> BlogFeedbacks { get; set; } 
     public DbSet<BlogCategoryList> BlogCategoryLists { get; set; } 
     public DbSet<BlogCategory> BlogCategories { get; set; } 

     protected override void OnModelCreating(ModelBuilder modelBuilder) 
     { 
      modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>(); 
      base.OnModelCreating(modelBuilder); 
     } 
    } 

POCO klas

public class Blog 
    {...} 
public class BlogFeedback 
    {...} 
public class BlogCategoryList 
    {...} 
public class BlogCategory 
    {...} 

Tabele generowane:

Blogs 
BlogCategories 
BlogCategoryLists 
BlogFeedbacks 

Co potrzebne:

Blog 
BlogCategory 
BlogCategoryList 
BlogFeedback 

Jedno może być inna jest moje rozwiązanie podzielić na dwie projektów podstawowych i internetowych. Core ma modele, usługi i cały Code First. Internet ma tylko Kontrolery i Widoki oraz odniesienie do Rdzenia. SetInitializer(). Seed() jest wewnątrz funkcji w rdzeniu, a w sieci globalnej.asax wywoływany jest Core.SetInitializer, więc zachowaj wszystkie funkcje CTP5 w rdzeniu. Baza danych jest odtwarzana w porządku, dane są wypełniane, tylko konwencja zachowuje PLURAL TABLE NAMES, ignorując zastąpienie przez modelBuilder

+0

Mam dokładnie ten sam problem. Znalazłeś rozwiązanie? – 0xbadf00d

+3

Tak, błędnie napisałem i użyłem niewłaściwej stałej konwencji. Upewnij się, że używasz "PluralizingTableNameConvention" zamiast "PluralizingEntitySetNameConvention". – Nestor

+0

Szkoda, już używam właściwego. Nie mam pojęcia, dlaczego jest to ignorowane. – 0xbadf00d

2

tutaj jest jeden wyciąg kodu, którego używam i działa w 100%. Spróbuj skopiować i wkleić i wypróbować, musi utworzyć nazwy pojedynczej nazwy tabeli. Używam EF4.1 i CE4.0

POCO klasy

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 

namespace CloudOne.Models 
{ 
    public class Brand 
    { 
     public int BrandID { get; set; } 
     [MaxLength(25)] 
     [Required] 
     public string BrandName { get; set; } 
     [MaxLength(1000)] 
     public string BrandDescription { get; set; } 
     public int SortOrder { get; set; } 
     //SEO 
     [MaxLength(70)] 
     public string PageTitle { get; set; } 
     [MaxLength(100)] 
     public string MetaDescription { get; set; } 
     [MaxLength(150)] 
     public string MetaKeywords { get; set; } 
     [MaxLength(56)] //50 + "-" + 99,000 
     public string Slug { get; set; } 
    } 
} 

kontekstu danych

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Data.Entity.ModelConfiguration.Conventions; 

namespace CloudOne.Models 
{ 
    public class SiteDataContext: DbContext 
    { 
     public DbSet<Brand> Brands { get; set; } 

     // Twist our database 
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
      base.OnModelCreating(modelBuilder); 
     } 
    } 
} 

Seed initializer

public class SiteDataContextInitializer: DropCreateDatabaseIfModelChanges<SiteDataContext> 
    { 
     protected override void Seed(SiteDataContext context) 
     { 
      var brands = new List<Brand>() 
      { 
       new Brand { BrandName = "Brand 1", Slug = "brand-1" }, 
       new Brand { BrandName = "Brand 2", Slug = "brand-2" } 
      }; 

      brands.ForEach(d => context.Brands.Add(d)); 

      base.Seed(context); 
     } 
    } 

Spróbuj skopiować i wkleić ten kod, a następnie napisać kod, aby wywołać tworzenie bazy danych (tj. spróbuj pobrać rekordy i pokazać na stronie indeksu).

Powiązane problemy