Модель сущности ADO.NET - Динамическое назначение TableAttribute - PullRequest
0 голосов
/ 03 марта 2019

Мне нужен проект, чтобы пользователь мог настроить информацию базы данных и имена таблиц в файле конфигурации.Я хочу использовать ADO.NET Entity Model для использования LINQ и просто держаться подальше от SQL, чтобы облегчить себе задачу.Есть ли способ динамически назначать, к какой таблице нужен класс для доступа к модалу?

Например: Вот как это обычно выглядит

    [Table("database.table")]
    public partial class table
    {
        [Key]
        [Column(TypeName = "usmallint")]
        public int ID { get; set; }

        [Required]
        [StringLength(128)]
        public string Instance { get; set; }

        [Required]
        [StringLength(60)]
        public string Name { get; set; }
    }

Я хочу иметь возможность динамическиустановите атрибут TableAttribute, чтобы модель знала, к какой таблице обращаться к классу.

    [Table(Config.DBName + Config.tableName)]
    public partial class table
    {
        [Key]
        [Column(TypeName = "usmallint")]
        public int ID { get; set; }

        [Required]
        [StringLength(128)]
        public string Instance { get; set; }

        [Required]
        [StringLength(60)]
        public string Name { get; set; }
    }

Любая помощь или уведомление о том, что это невозможно, приветствуются.

1 Ответ

0 голосов
/ 04 марта 2019

Я не проверял это, но я думаю вы можете сделать это путем реализации пользовательских соглашений - если вы используете EF6 по крайней мере.

Сначалавам нужно создать пользовательское соглашение:

public class CustomTableNameConvention : IStoreModelConvention<EntitySet>
{
    private readonly string _tablePrefix;

    public CustomTableNameConvention(string tablePrefix)
    {
        _tablePrefix = tablePrefix;
    }

    public void Apply(EntitySet item, DbModel model)
    {
        //change table name.
        item.Table = $"{_tablePrefix}" + item.Table;
    }
}

Далее вам нужно добавить это соглашение в метод OnModelCreating вашего контекста:

public class MyContext : DbContext
{
    public MyContext(string connectionString) : base(connectionstring)
    {
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //get the dynamic table prefix...
        var myAppPrefix = "user1";
        modelBuilder.Conventions.Add(new CustomTableNameConvention(myAppPrefix));
        base.OnModelCreating(modelBuilder);
    }

    public DbSet<SomeModel> { get; set; }
    ...
}

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

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...