Entity Framework 4 Только код Получить имя таблицы из метаданных для объекта домена POCO
Привет, я использую код Entity Framework только из CTP4. У меня такой вопрос: учитывая имя класса домена, который отображается с помощью EntityConfiguration, как я могу получить имя таблицы для сопоставленного класса во время выполнения? Я предполагаю, что мне нужно использовать MetadataWorkspace в ObjectContext, но мне сложно получить актуальную документацию. Любая помощь или ссылки будут высоко ценится. Благодарю.
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").
}
Я сомневаюсь, что это идеальное решение, но, как я использовал его раньше, и это работало без проблем.