Вопрос по sql-server, c#, entity-framework – Изменить карту сущностей на другую «неизвестную» таблицу во время выполнения

5

Я должен написать приложение C #, которое работает с базой данных сервера SQL, созданной и поддерживаемой старым приложением. Приложение создает новые таблицы каждый год и свойство "год" & quot; находится в названии таблицы. Количество создаваемых таблиц может варьироваться в зависимости от количества «разделов». что пользователь создал внутри приложения. Поэтому мне приходится работать с такими таблицами, как Cwx_DRyz (что само собой разумеется ...), где & quot; wx & quot; может быть разделом, и "yz" будет год. Примером группы таблиц может быть:

C01_DR07

C01_DR08

C01_DR09

C02_DR08

C02_DR09

C03_DR06

C04_DR12

И все эти таблицы могут представлять, например, клиентов. Это будут клиенты из разных секций и разных лет, но клиенты с одинаковой структурой.

У меня вопрос: могу ли я иметь объект Client для обработки всех этих таблиц и изменения сопоставления от одной к другой во время выполнения? Название гласит «неизвестно» потому что я не знаю таблицы до времени выполнения.

Самый похожий вопрос, который я нашел,Entity Framework отображает несколько таблиц в одну сущность и ответ заключается в том, чтобы использовать «Таблицу на конкретное наследование типов», но в моем случае это бесполезно.

PS: EF версии 4.3.1 и VS2010

РЕДАКТИРОВАТЬ: таблицы не имеют первичных ключей ... Большинство из них имеют столбцы, которые имеют уникальные значения (целое число или строка).

Ваш Ответ

1   ответ
4

Если вы используете & quot; сначала код & quot; Вы можете создать отображение, как вы хотите. Это также работает с существующими базами данных, когда созданное вами сопоставление совпадает с базой данных.

Таким образом, всякий раз, когда вы создаете контекст, вы можете создать строку (имя таблицы), которую вы хотите отобразить.

Некоторые примеры кодов для «сначала кода» и как вы могли бы начать:

DbContext:

public DbSet<YourEntity> YourEntities { get; set; }
...

// this is called when the db gets created and does the configuration for you => maybe not needed in your case
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    ConfigurationRegistrar configurationRegistrar = modelBuilder.Configurations;

    new GeneralEntitiesConfiguration(configurationRegistrar);
}

GeneralEntitiesConfiguration - это класс, который я использую для обработки конфигураций, не более чем помощник, который выглядит следующим образом:

public class GeneralEntitiesConfiguration
{
    public GeneralEntitiesConfiguration(ConfigurationRegistrar configurationRegistrar)
    {
        configurationRegistrar.Add(new YourEntityConfiguration());
        //and additional configurations for each entity, just to splitt it a bit and have it more read and maintenance able
    }
}

YourEntityConfiguration - это класс, в котором у меня есть все конфигурации для этой сущности:

public class YourEntityConfiguration : EntityTypeConfiguration<YourEntity>
{
    public YourEntityConfiguration ()
    {
        ToTable("WhatEverYouLike"); // here you can do any magic to map this entity to a table, just make sure that your properties are mapped to the correct colums
        Property(entity => entity.Id).HasColumnName("YouColumnName");

        //and here you also have to do the other configurations
    }
}

При запуске приложения (или перед первой инициализацией контекста) вам необходимо инициализировать базу данных. Поэтому вы можете использовать инициализатор, который проверяет базу данных и обрабатывает различия. Построить есть такие вещи, как & quot; DropCreateDatabaseAlways & quot; или & quot; DropCreateDatabaseIfModelChanges & quot; = & GT; вам нужно создать свой собственный, который просто игнорирует любые различия. В моем примере я создал один, который просто вызывает исключение, когда модель отличается (я хотел обработать изменения модели с помощью scipts для первой попытки):

//before using the context the first time i'm calling, you can ignore the connection string
DbContextInitializer.Init(conString);

public static class DbContextInitializer
{
    public static void Init (string connectionString)
    {
        Database.SetInitializer(new CreateDbThrowExceptionIfModelDiffersInitializer<SMDbContext>());

        using(var dbContenxt = new MyDbContext(connectionString))
        {
            try
            {
                dbContenxt.Database.Initialize(true);
            }
            catch(DatabaseModelDiffersException diffException)
            {
                // some magic...
            }
            catch(Exception ex)
            {
                // TODO: log
                throw;
            }
        }
    }

    public class CreateDbThrowExceptionIfModelDiffersInitializer<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext
    {
        public void InitializeDatabase(TContext context)
        {
            using (new TransactionScope(TransactionScopeOption.Suppress))
            {
                if (!context.Database.Exists())
                    context.Database.Create();
            }

            if (!context.Database.CompatibleWithModel(true))
            {
                throw new DatabaseModelDiffersException("Database Model differs!");
            }
        }

        protected virtual void Seed(TContext context)
        {
            // create data if you like
        }
    }

    // just an exception i'm using for later useage
    public class DatabaseModelDiffersException : Exception
    {
        public DatabaseModelDiffersException(string msg) : base(msg)
        {}
    }
}

Надеюсь, у вас есть представление о том, что вы можете обрабатывать динамические имена таблиц с помощью платформы управления данными Если есть еще вопросы, просто задавайте;)

Хорошо, большое спасибо. CarlosJ
Я выложу это на выходных!
Будет ли это проблемой, если информация, добавленная в только что сделанную мной РЕДАКТИРОВАТЬ ??? CarlosJ
Мне также было бы очень интересно посмотреть на ваши образцы. Пингуй мне, когда получишь их.
Сопоставление не обязательно совпадает с базой данных, поскольку не все пользователи имеют все «сущности» (набор таблиц) создан. Это обязательно полное совпадение? Во всяком случае, я был бы признателен за эти образцы. CarlosJ

Похожие вопросы