У меня есть эта проблема. Сейчас я работаю над старым программным обеспечением, перенося его с 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
}
Спасибо за помощь.