【问题标题】:Null Navigation In EF 5 code-firstEF 5 代码优先中的空导航
【发布时间】:2012-12-19 07:14:35
【问题描述】:

我有一个使用 Entity Framework 5 代码的应用程序,这是我的类的示例:

public partial class PlaningCourseAssistant 
{
    public PlaningCourseAssistant() {}
    public int ID { get; set; }
    public int PlaningCourseID { get; set; }
    public int AssistantID { get; set; }

    public virtual PlaningCourse PlaningCourse { get; set; }
    public virtual Teacher Assistant { get; set; }
} 

public class Teacher 
{
    public Teacher() 
    {
        ...
        this.PlaningCourseAssistants = new HashSet<PlaningCourseAssistant>();
    }
    public int ID { get; set; }
    public string Name{ get; set; }
    ....
    public virtual ICollection<PlaningCourseAssistant> PlaningCourseAssistants { get; set; }
}

public partial class PlaningCourse 
{
    public PlaningCourse() 
    {
    ...
        this.PlaningCourseAssistants = new HashSet<PlaningCourseAssistant>();
    }
    public int ID { get; set; }
    public string Title { get; set; }
    ...
    public virtual ICollection<PlaningCourseAssistant> PlaningCourseAssistants { get; set; }
}

当我像这样向我的PlaningCourseAssistant 添加一个新对象时:

var pcb = new PlaningCourseAssistant 
{
    PlaningCourseID = CourseID,
    AssistantID = assistantID,
};
try 
{
    planingCourseAssistantService.Add(pcb);
    uow.SaveChanges();
} catch { }

之后当我想获取PlaningCourseAssistant 列表时,添加的PlaningCourseAssistantAssistant 导航键为空。

为什么会这样?我该如何解决这个问题?

【问题讨论】:

    标签: c# asp.net ef-code-first entity-framework-5


    【解决方案1】:

    EF 不能延迟加载“Assistant”属性,因为您使用的 PlaningCourseAssistant 实例不是 EF 创建的代理。

    您可以使用显式加载

    context.Entry(pcb).Reference(p => p.Assistant).Load();
    context.Entry(pcb.Assistant).Collection(p => p.PlaningCourseAssistant).Load();
    

    或者让EF创建一个PlaningCourseAssistant的代理实例

    var pcb = context.PlaningCourseAssistants.Create();
    

    【讨论】:

    • @Raika EF 创建实体的子类以添加延迟加载导航属性所需的逻辑。这些被称为代理。
    • Create 方法有帮助。但如果我想使用它,我需要更改这么多代码。有什么方法可以将我的对象转换为代理对象,而不会丢失任何数据?我的意思是我创建一个PlaningCourseAssistants 对象并填充它的数据。现在我想将它转换为具有相同数据的代理对象。这可能吗?
    • @Raika 不。您创建了一个泄漏的抽象。您可以将Create 方法添加到您的uow,它调用底层DbSet.Create
    • 是的,我在我的问题之后通过搜索和测试来弄清楚。是时候改变代码了。 :))。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多