我有这个问题。现在,我正在开发一个旧软件,将其从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
}
感谢帮助。
答案 0 :(得分:1)
您可能正在寻找include
方法(以下示例):
public static IQueryable<ATrial> GetAll(){
return context.ATrials
.Include(t => t.OTrials);
}
您正在执行的是处理实体的通用方法,但默认情况下不包括相关实体。
编写一个特定的吸气剂,在这种情况下,该吸气剂使用include
检索相关实体。
编辑 Here是相关文档。
希望有帮助。