Расширение OnModelCreating с помощью пользовательских конфигураций - PullRequest
0 голосов
/ 10 мая 2019

У меня есть эта проблема. Сейчас я работаю над старым программным обеспечением, перенося его с VB на C #.

Проблема в том, что база данных находится в горизонтальном состоянии. Нет внешних ключей, нет первичных ключей ...

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

Тогда я хотел бы унаследовать от контекста и добавить fluent-api в мой новый контекст и исправить то, что мне нужно, с помощью EntityConfiguration и в частичных объектах класса.

Проблема в том, что это просто не сработает.

Вот мой контекст:

public partial class DbTmContext : BaseContext
{
    public DbTmContext() : base()
    {
        Database.SetInitializer<DbTmtContext>(null);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new ATrialTypeConfiguration());
        modelBuilder.Configurations.Add(new OTrialTypeConfiguration());
    }
}

Затем я расширяю сущности:

public partial class ATrial
{
    public virtual ICollection<OTrial> OTrials { get; set; }
}

public partial class OTrial
{
    public virtual ATrial ATrial { get; set; }
}

И добавить конфигурации ...

public class ATrialTypeConfiguration : EntityTypeConfiguration<ATrial>
{
    public ATrialTypeConfiguration()
    {
        HasKey(z => z.Id);

        HasMany<OTrial>(z => z.OTrials)
            .WithRequired(o => o.ATrial)
            .HasForeignKey(o => o.Id_ATrial);
    }
}

public class OTrialTypeConfiguration : EntityTypeConfiguration<OTrial>
{
    public OTrialTypeConfiguration()
    {
        HasRequired<ATrial>(o => o.ATrial)
            .WithMany(z => z.OTrials)
            .HasForeignKey(o => o.Id_ATrial);
    }
}

Когда я получаю объект Otrial или объект Atrial, я не могу получить доступ к связанным элементам. Они просто нулевые.

Для вызова сущности у меня есть класс репозитория. Это наследуется от абстрактного SqlUnit класса, который имеет контекст и реализует IDisposable

public class Repository<TEntity> : SqlUnit, IRepository<TEntity> where TEntity : class
{
    public TEntity Get(int id)
    {
        try
        {
            return Context.Set<TEntity>().Find(id);
        }
        catch (Exception)
        {
            throw;
        }
    }
}

Так что, чтобы использовать EF, я просто делаю ..

        using(Repository<OTrial> sql = new Repository<OTrial>())
        {
            var otrial = sql.Get(522726); <<<<< IS OK
            var atrial = otrial.ATrial; <<<<< WILL BE NULL
        }

Спасибо за помощь.

1 Ответ

1 голос
/ 10 мая 2019

Вы, вероятно, ищете метод include (пример ниже):

public static IQueryable<ATrial> GetAll(){
     return context.ATrials
         .Include(t => t.OTrials);
 }

То, что вы делаете, - это общий способ работы с вашими сущностями, но по умолчанию он не включает связанные сущности.

Код конкретного получателя, который использует include для получения связанных сущностей в этом случае.

РЕДАКТИРОВАТЬ Здесь - соответствующий документ.

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

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