Только код Entity Framework 4 Получить имя таблицы из метаданных для объекта домена POCO

Привет, я использую код Entity Framework только из CTP4. Мой вопрос таков: учитывая имя класса домена, который отображается с помощью EntityConfiguration, как я могу получить имя таблицы для сопоставленного класса во время выполнения? Я предполагаю, что мне нужно использовать MetadataWorkspace в ObjectContext, но мне сложно получить актуальную документацию. Любая помощь или ссылки будут высоко оценены. Спасибо.


person Raoul    schedule 28.09.2010    source источник


Ответы (1)


Да, вы правы, всю информацию о сопоставлении можно получить через MetadataWorkspace.

Ниже приведен код для удаления имен таблиц и схем для класса Product:

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

Теперь, чтобы получить имя таблицы для класса Product, вам нужно создать DbContext и использовать следующий код:

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").
}

Я сомневаюсь, что это идеальное решение, но, поскольку я использовал его раньше, и оно работало без проблем.

person Alexander Manekovskiy    schedule 30.01.2013