Как сгенерировать IDbSet вместо DbSet - PullRequest
0 голосов
/ 30 октября 2018

Я новичок в C# и EntityFramework, и мне нужно поддерживать активное программное обеспечение. Мне нужно было создать новую таблицу, поэтому я создал ее в базе данных, а затем обновил свою модель с помощью EntityFramework.

Тем не менее, похоже, что предыдущий разработчик писал код непосредственно в сгенерированном коде (класс Mode.Context.cs) и EntityFramework, когда обновление модели вытирает ее и переписывает полностью.

Итак, я сделал новый частичный класс Model. Это выглядит так:

public partial class Model : DbContext, IModel
    {
        public void SomeRandomMethod();
    }

И сгенерированная модель выглядит так:

public partial class Model : DbContext
{
    public Model()
        : base("name=Model")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public DbSet<RandomTable> ARandomTable { get; set; }
}

Проблема, однако, заключается в том, что ранее модель использовала IDbSet вместо DbSet, а интерфейс IModel запрашивает IDbSet<RandomTable> ARandomTable

Как правильно с этим справиться?

1 Ответ

0 голосов
/ 30 октября 2018

Обычно Dbcontext, представляющий вашу базу данных, имеет несколько свойств DbSet<TEntity>, где каждый DbSet представляет таблицу в вашей базе данных.

Все не виртуальные свойства TEntity представляют столбцы в вашей таблице; виртуальные свойства TEntity представляют отношения между таблицами: один ко многим, многие ко многим и т. д.

Каждый DbSet<TEntity> реализует IDbSet<TEntity>, поэтому, где бы ваш старый DbContext не использовал IDbSet, вы можете вместо него присвоить ему DbSet.

Если я правильно вас понял, у вашего старого DbContext были некоторые свойства, которые реализовали IDbSet<...>, и метод SomeRandomMethod использовал эти свойства.

class MyOldDbContext : DbContext
{
     public IDbSet<Aentity> Aentities {get; set;}
     public IDbSet<Bentity> BEntities {get; set;} 

     public void SomeRandomMethod()
     {   // this method uses the IdBsets AEntities and BEntities:
         IDbSet<AEntity> x = this.AEntities;
         IDbSet<BEntity> y = this.BEntities;
         ... // do something with x and y
     }
}

Теперь ваш новый DbContext. Если DbSets имеют те же типы сущностей, что и старые, проблем нет:

class MyNewDbContext : DbContext
{
     public DbSet<Aentity> Aentities {get; set;}
     public DbSet<Bentity> BEntities {get; set;} 

     public void SomeRandomMethod()
     {   // this method uses the DbSets AEntities and BEntities, which implement IDbSet
         IDbSet<AEntity> x = this.AEntities;
         IDbSet<BEntity> y = this.BEntities;
         ... // do something with x and y
     }
}

Обратите внимание, что AEntities / BEntities теперь DbSet<...> вместо IDbSet<...>. Поскольку каждый DbSet<...> реализует IDbSet<...>, ваша проблема решена.

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

class MyNewDbContext : DbContext
{
     public DbSet<Teacher> Teachers {get; set;}
     public DbSet<Student> Students {get; set;} 

     public void SomeRandomMethod()
     {   // this method uses the IdBset of AEntities and BEntities:
         IDbSet<AEntity> x = this.AEntities;
         IDbSet<BEntity> y = this.BEntities;
         ... // do something with x and y
     }

     // for SomeRandomMethod we need properties AEntities and BEntities
     // use your new DbSets to mimic the old AEntities and BEntities
     private IDbSet<AEntity> AEntities => this.Teachers
          .Join(this.Students, ...)
          .Where(...)
          .Select(...);
      // similar for BEntities
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...