EF и существующая база данных и таблица, с кучей новых таблиц - PullRequest
0 голосов
/ 09 января 2019

EF и существующая база данных и таблица, с кучей новых таблиц.

Контекст:

В старой базе данных есть пользователь таблицы, который будет использовать новое приложение. Я использовал объект DataModel Wizard, чтобы отобразить его this .

Что у меня сейчас:

Куча новых сущностей и их конфигурация:

public class Bundle
{
    public Bundle() { Produits = new HashSet<Produit>(); }
    public int BundleID { get; set; }
    public string Designation { get; set; }
    public ICollection<Produit> Produits { get; set; }
}

public class BundleConfiguration : EntityTypeConfiguration<Bundle>
{
    public BundleConfiguration()
    {
        ToTable("PL_Bundle");
        HasKey(e => e.BundleID);
        Property(e => e.Designation).HasMaxLength(200);
    }
}

A DbContext с расширением, использующим отражение для отображения всех доступных конфигураций.

public partial class FooBarDbContext : DbContext
{
    public FooBarDbContext() : base("name=Model1")
       => Database.SetInitializer<FooBarDbContext>(null);

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.ApplyAllConfigurations();
        base.OnModelCreating(modelBuilder);
    }

    public DbSet<User> User { get; set; }
    public DbSet<Bundle> Bundles { get; set; }
    // [...]
}

public static class ModelBuilderExtensions
{
    public static void ApplyAllConfigurations(this DbModelBuilder modelBuilder)
    {
       IEnumerable<Type> typesToRegister
            = AppDomain.CurrentDomain.GetAssemblies()
                .SelectMany(t => t.GetTypes())
                .Where(t => t.IsClass)
                .Where(type => !string.IsNullOrEmpty(type.Namespace) &&
                        type.GetTypeInfo().BaseType != null &&
                        type.GetTypeInfo().BaseType.GetTypeInfo().IsGenericType &&
                        type.GetTypeInfo().BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>))
                .ToArray();

        foreach (var type in typesToRegister)
        {
            dynamic configurationInstance = Activator.CreateInstance(type);
            modelBuilder.Configurations.Add(configurationInstance);
        }
    }
}

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

static void Main(string[] args)
{
    var db = new FooBarCore.DbContext.FooBarDbContext();

    var all = db.User.ToList();        // Work
    var bundles1 = db.Bundles.ToList();     

Предыдущая строка выдает мне сообщение об ошибке:

Nom d'objet 'dbo.PL_Bundle' non valide. => Неверное имя объекта 'dbo.PL_Bundle'

Что я пробовал:

  1. Нахождение проблемы ModelBuilderExtensions. Но с использованием классического modelBuilder.Configurations.Add(new BundleConfiguration());. Или используя свободный API прямо в OnModelCreating выдает ту же ошибку.

  2. Проверьте базу данных => Таблицы здесь нет.

  3. Поиск EF not create table, но CreateDatabaseIfNotExist, DropCreateDatabaseWhenModelChanges, DropCreateDatabaseAlways страшны, все они имеют эту Drop Database в названии.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

так, как указано в комментарии:

Nom d'objet 'dbo.PL_Bundle' non valide. => Неверное имя объекта 'Dbo.PL_Bundle'

это означает, что EF считает, что должна быть таблица PL_Bundle, но ее нет. Его там нет, потому что вы добавили новый класс в вашу модель.

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

Вы должны включить миграцию, сгенерировать миграцию и применить ее к базе данных.

Хорошей практикой является сохранение миграций также в виде сценариев SQL (с использованием сценария UpdateDatabase -script) и заставление системного администратора применять их вручную, чтобы предотвратить любые секретные потери данных, например, при удалении столбца или таблицы.

Вы поставляете скрипты с новыми версиями программного обеспечения, и он должен аварийно завершить работу, пока миграция не будет применена, указав в журналах, какая из них необходима.

0 голосов
/ 09 января 2019

Обновите ваш класс DbContext так:

public partial class FooBarDbContext : DbContext
{
    public FooBarDbContext() : base("name=Model1")
       => Database.SetInitializer<FooBarDbContext>(null);

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
       //Configurations for Bundle class
       modelBuilder.Entity<Bundle>()
                .ToTable("PL_Bundle")
        .HasKey(e => e.BundleID);
        .Property(e => e.Designation).HasMaxLength(200);

        modelBuilder.ApplyAllConfigurations();
        base.OnModelCreating(modelBuilder);
    }

    public DbSet<User> User { get; set; }
    public DbSet<Bundle> Bundles { get; set; }
    // [...]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...