使用自定义配置扩展OnModelCreating

时间:2019-05-10 13:24:38

标签: c# entity-framework ef-fluent-api

我有这个问题。现在,我正在开发一个旧软件,将其从VB迁移到C#。

问题是数据库处于horid状态。没有外键,没有主键...

无论如何,现在我的同事正在处理数据库。但是,在他完成之前,我必须继续编码我的部分。但是,我离不开该死的数据库(这将需要几个月的时间)。所以我拥有的是EF自动生成的模型。

然后,我想从上下文继承,并将fluent-api添加到我的新上下文中,并通过EntityConfigurations和部分类实体修复所需的内容。

问题是,它根本无法工作。

下面是我的上下文:

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 个答案:

答案 0 :(得分:1)

您可能正在寻找include方法(以下示例):

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

您正在执行的是处理实体的通用方法,但默认情况下不包括相关实体。

编写一个特定的吸气剂,在这种情况下,该吸气剂使用include检索相关实体。

编辑 Here是相关文档。

希望有帮助。

相关问题