实体框架导航属性为 null(使用 T4),但如果使用旧版 ObjectContext,则具有值

Entity Framework navigation property is null(using T4) but has a value if using Legacy ObjectContext

提问人:Kristijan 提问时间:10/20/2023 更新时间:10/20/2023 访问量:40

问:

我们使用数据库优先的方法。我们重写了使用 Oracle 和 Legacy ObjectContext 代码生成策略的旧系统,并将 T4 和 Mysql 作为数据库。 由于MS Forms的数据绑定,我们遵循了Microsoft指南,将ICollections更改为ObservableListSource。

我们现在遇到的问题是,下面的代码可以按预期在“旧 Oracle”系统中工作,但在我们的新 T4 Mysql 中却不能。 因此,我们遇到的问题是,在我们将新对象添加到列表后,导航属性应该有一个值而不是 null。 延迟加载已打开。

ORACLE 代码:传统

S_SUMREPORT rep = (S_SUMREPORT)s_SUMREPORTBindingSource.DataSource;
var emails = databaseEntities.S_SUB_CONTACT.Where(p => p.FK_SUB.Equals('code'));
if (emails != null)
{
    foreach (S_SUBCLIPPING_CONTACT c in emails)
    {
        S_SUMREPORT_CONTACT contact = new S_SUMREPORT_CONTACT();
        contact.FK_EXP_TEMPLATE = c.FK_EXP_TEMPLATE;
        rep.S_SUMREPORT_CONTACT.Add(contact);
       ////now the call to navigation property S_EXP_TEMPLATE is NOT null! 
       bool IsActive = contact.S_EXP_TEMPLATE.ACTIVE;
    }
}
 

MYSQL T4 代码

S_SUMREPORT rep = (S_SUMREPORT)s_SUMREPORTBindingSource.DataSource;
var emails = databaseEntities.S_SUB_CONTACT.Where(p => p.FK_SUB.Equals('code'));
if (emails != null)
{
    foreach (S_SUBCLIPPING_CONTACT c in emails)
    {
        S_SUMREPORT_CONTACT contact = databaseEntities.S_SUMREPORT_CONTACT.Create();
        contact.FK_EXP_TEMPLATE = c.FK_EXP_TEMPLATE;
        rep.S_SUMREPORT_CONTACT.Add(contact);
       ////now the call to navigation property S_EXP_TEMPLATE IS null! 
       bool IsActive = contact.S_EXP_TEMPLATE.ACTIVE;
    }
}

我们的结果: 在 oracle 中,呼叫联系。S_EXP_TEMPLATE在调试器中将有一个值,甚至没有执行调用 在 Mysql 中,呼叫联系。S_EXP_TEMPLATE 为 null,除非我们调用 databaseEntities.Entry(contact)。否则致电联系人。S_EXP_TEMPLATE。ACTIVE 引发 null 指针异常。

注意: 具有旧版 ObjectContext 代码生成器的 Oracle 正在创建 EntityCollection,其中 T4 正在为导航属性创建 ObservableListSource。 我们的联系人是 DynamicProxy

我不知道当我不想存储某些内容但想立即使用它们时,向 dbContext(这是我们的 databaseEntities)添加某些内容的“正确”方法是什么。

基本上,我们有一个带有电子邮件的简单表单,对于这些电子邮件,您可以根据导出模板生成pdf,如果pdf成功,则保存更改。

但正如我之前所说,导航属性只有在将其添加到列表(rep.S_SUMREPORT_CONTACT。Add(contact)) 我们调用 databaseEntities.Entry(contact)

这应该像这样工作吗?我读到,是的,该值为 null,但由于延迟加载,该值将成为某种东西,而不是保持 null。

谢谢。

C# mysql winforms -框架实体

评论


答: 暂无答案