EF 4.1, POCO: есть ли способ получить имя таблицы во время выполнения, чтобы избежать жесткого кода? - PullRequest
3 голосов
/ 12 августа 2011

Я использую POCO в Entity Framework.Есть ли прямой или косвенный способ в последней версии EF получить имя таблицы во время выполнения, чтобы избежать значений жесткого кода?

Мне нужно это в моем пользовательском инициализаторе базы данных для запуска кода, подобного этому:

context.Database.ExecuteSqlCommand(
    string.Format("DBCC CHECKIDENT ({0}, RESEED, {1})", tableName, newSeed))

Спасибо

Ответы [ 4 ]

1 голос
/ 29 августа 2011

Я работаю с предположением, что ваш контекст выглядит примерно так, как у меня, когда каждое имя таблицы генерируется из имен классов, когда вы добавляете DbSet в ваш контекст.Если это так, вы можете достичь своей цели с помощью рефлексии, хотя это немного некрасиво:

public class MyContext : DbContext
{
    public MyContext() : base("MyDatabase")
    {
    }

    public DbSet<Video> Video { get; set; }
    public DbSet<VideoRating> Rating { get; set; }
    public DbSet<User> User { get; set; }

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

    public class Initializer : IDatabaseInitializer<DashVaultContext>
    {
        public void InitializeDatabase(MyContext context)
        {
            if (!context.Database.Exists())
            {
                context.Database.Create();

                PropertyInfo[] propertyInfos = typeof(MyContext).GetProperties(BindingFlags.DeclaredOnly |
                BindingFlags.Public | BindingFlags.Instance);

                var newSeed = 1000; // Or whatever is appropriate

                foreach (PropertyInfo propertyInfo in propertyInfos)
                {
                    var tableName = propertyInfo.PropertyType.GetGenericArguments()[0].Name;
                    context.Database.ExecuteSqlCommand(
                        string.Format("DBCC CHECKIDENT ({0}, RESEED, {1})", tableName, newSeed));
                }
            }
        }
    }
}

ОБНОВЛЕНИЕ: Я удалил хакерскую функцию плюрализации и просто отключил плюрализацию в именах созданных таблиц (см. Переопределение OnModelCreating).

0 голосов
/ 25 августа 2011

Глядя на то, насколько «активным» является это обсуждение, мне кажется, что эта функциональность просто отсутствует в текущей версии EF.Я надеюсь, что эта функция будет доступна в одной из будущих версий EF.

0 голосов
/ 26 августа 2011

Этот код будет полезен вообще?

        var query = from meta in context.MetadataWorkspace.GetItems(DataSpace.SSpace)
          .Where(m => m.BuiltInTypeKind == BuiltInTypeKind.EntityType)
        let properties = meta is EntityType ? (meta as EntityType).Properties : null
        select new
        {
          TableName = (meta as EntityType).Name,
          Fields = from p in properties
                   select new
                   {
                     FielName = p.Name,
                     DbType = p.TypeUsage.EdmType.Name
                   }
        };
0 голосов
/ 23 августа 2011

POCO означает, что вы можете использовать «старые-старые» объекты CLR (POCO), такие как существующие объекты домена, с вашей моделью данных. Эти классы данных POCO (также известные как объекты невосприимчивости к постоянству), которые сопоставляются с сущностями, определенными в модели данных, и по определению не должны быть напрямую связаны с деталями реализации базы данных. Тем не менее, вы можете использовать константный класс и отображение Fluent, чтобы лучше удовлетворить ваши требования

Ваша постоянная реализация класса

public static class Constant
{
 public const string CreditCustomer = "dbo.CreditCustomer";
}

Ваше отображение выглядит так

builder.Entity<Customer>() 
.HasKey(c => c.ID) 
.MapSingleType(c => new { 
     cid = c.ID, 
     nme = c.Name 
  } 
) 
.ToTable(Constant.Table.CreditCustomer);

В вашем dbInitializer

context.Database.ExecuteSqlCommand(
string.Format("DBCC CHECKIDENT ({0}, RESEED, {1})", Constant.Table.CreditCustomer, newSeed))
...