2010-09-28 5 views
4

Bonjour J'utilise le code Entity Framework uniquement à partir de CTP4. Ma question est la suivante: étant donné le nom d'une classe de domaine qui est mappée à l'aide d'une EntityConfiguration, comment puis-je récupérer le nom de la table pour la classe mappée à l'exécution? Je suppose que j'ai besoin d'utiliser MetadataWorkspace sur ObjectContext, mais j'ai du mal à obtenir la documentation à jour. Toute aide ou liens seraient grandement appréciés. Merci.Entity Framework 4 Code uniquement Obtenir le nom de la table à partir de MetaData pour l'objet de domaine POCO

Répondre

1

Oui, vous avez raison, toutes les informations de mappage ont pu être récupérées via MetadataWorkspace.

est sous le code de retireve noms de table et schéma pour Product classe:

public class Product 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

public class ProductConfiguration : EntityTypeConfiguration<Product> 
{ 
    public ProductConfiguration() 
    { 
     HasKey(e => e.Id); 

     Property(e => e.Id) 
      .HasColumnName(typeof(Product).Name + "Id"); 

     Map(m => 
     { 
      m.MapInheritedProperties(); 
      m.ToTable("ProductsTable"); 
     }); 

     Property(p => p.Name) 
      .IsRequired() 
      .IsUnicode(); 
    } 
} 

public class Database : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new ProductConfiguration()); 
    } 

    public DbSet<Product> Products { get; set; } 
} 

Maintenant, pour récupérer le nom de table pour Product classe, vous devez créer DbContext et utiliser le code suivant:

using(var dbContext = new Database()) 
{ 
    var adapter = ((IObjectContextAdapter)dbContext).ObjectContext; 
    StoreItemCollection storageModel = (StoreItemCollection)adapter.MetadataWorkspace.GetItemCollection(DataSpace.SSpace); 
    var containers = storageModel.GetItems<EntityContainer>(); 

    EntitySetBase productEntitySetBase = containers.SelectMany(c => c.BaseEntitySets.Where(bes => bes.Name == typeof(Product).Name)).First(); 

    // Here are variables that will hold table and schema name 
    string tableName = productEntitySetBase.MetadataProperties.First(p => p.Name == "Table").Value.ToString(); 
    string schemaName = productEntitySetBase.MetadataProperties.First(p => p.Name == "Schema"). 
} 

Je doute que ce soit une solution parfaite mais comme je l'ai déjà utilisé et cela a fonctionné sans problèmes.

Questions connexes