web-dev-qa-db-fra.com

Entity Framework Code Premières conventions de dénomination - retour à plusieurs noms de table?

Je prends juste une fissure au niveau du code cadre d'entité. Suite à leur convention de nommage, nous devons maintenant nommer nos tables au pluriel pour ne pas avoir à intervenir avec l'outil. Je sais que les mappages peuvent être dépassés. Ma question est la suivante: après des années à suivre la convention de dénomination singulière, sommes-nous revenus à utiliser des noms pluriels?

De plus, je me demandais pourquoi les nouveaux exemples utilisaient Northwind au lieu de Adventure Works. Je pense que la raison en est que AW utilise un nom singulier et qu'ils ne pourraient pas montrer les fonctionnalités sans code

37
Paul Speranza

La version RTM de Code First prend entièrement en charge une fonctionnalité intéressante appelée Conventions de connexion où vous pouvez ajouter ou remplacer les conventions par défaut telles que celle que vous avez mentionnée.

Heureusement, ce que vous recherchez est déjà inclus dans CTP5. Vous pouvez désactiver la convention de pluralisation des noms de table en supprimant la convention PluralizingTableNameConvention . Voici tout le code dont vous avez besoin pour écrire à ce sujet:

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

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


. Cela dit, vous devez toujours écrire du code pour travailler avec la base de données Northwind dans Code First.

72
Morteza Manavi

voici un extrait du code que j'utilise et qui fonctionne à 100%. Essayez de copier-coller et essayez-le, il doit créer des noms de table de noms singuliers. J'utilise EF4.1 et CE4.0

Classe POCO

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; }
    }
}

Contexte des données

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);
        }
    }
}

L'initialiseur Seed

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);
        }
    }

Essayez de copier et coller ce code, puis écrivez du code pour déclencher la création de la base de données (c'est-à-dire essayez de récupérer les enregistrements et de l'afficher dans la page d'index).

2
Nestor

J'ai essayé et c'est comme EF4 CTP5 l'ignore totalement. Qu'est-ce qui ne va pas?

en utilisant la section:

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);
        }
    }

Cours POCO

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

Tables générées:

Blogs
BlogCategories
BlogCategoryLists
BlogFeedbacks

Ce dont j'ai besoin:

Blog
BlogCategory
BlogCategoryList
BlogFeedback

Une chose peut être différente si je divise ma solution en deux projets Core et Web. Le noyau a des modèles, des services et tout le code d'abord. Le Web n'a que des contrôleurs et des vues et une référence à Core. SetInitializer (). Seed () est à l'intérieur d'une fonction dans Core, et dans Web global.asax, Core.SetInitializer est appelé, donc conservez toutes les fonctions CTP5 dans Core. La base de données est recréée correctement, les données sont remplies correctement, seule la convention conserve les NOMS DE TABLE PLURIELS, ignorant la substitution de modelBuilder

1
Nestor