是否有可能急切地在Entity Framework中的新对象上加载外键?

时间:2016-08-08 18:30:21

标签: c# entity-framework

我有以下实体:

public class Seminar
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string Title { get; set; }
    public string Description { get; set; }

    public virtual List<Meeting> Meetings { get; set; }
}

public class Meeting
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int SeminarId { get; set; }
    public string ThirdPartyId { get; set; }
    public DateTime StartDate { get; set; }

    public virtual Webinar Webinar { get; set; }
}

MeetingSeminar属性(外键)与SeminarId相关。

调用第三方API后填充ThirdPartyId属性(名称已更改以保护我的兴趣) - 它是&#34;链接&#34;到那个系统。

为了进行此调用(我们在该系统上创建相同的对象),我们需要与会议相关的研讨会中的TitleDescription信息。

所以,让我说我创建一个新的会议:

using (var db = new MyDbContext())
{
    Meeting meeting = new Meeting
    {
        SeminarId = 5 // this would normally be loaded from elsewhere, obviously
    };

    // Load the meeting.Webinar property somehow here

    m_thirdPartyApiClient.CreateMeeting(meeting); // Uses meeting.Webinar.Title and meeting.Webinar.Description

    db.SaveChanges();
}

我想要做的是在调用第三方API或meeting之前在SaveChanges加载外键属性。这可能吗?

2 个答案:

答案 0 :(得分:1)

只需通过其ID为研讨会调用数据库,并将其分配给会议,如Meeting.Seminar = dbSeminar。要回答你的评论,virtual只是说这个方法/属性可能被一个继承类覆盖,当被覆盖使用继承类的prop / method 时,即使ref是类型基类只要实际类型是继承类。

答案 1 :(得分:1)

将实体对象添加到相应的DbSet后,您可以使用Load方法加载任何引用属性,如下所示:

Meeting meeting = new Meeting
{
    SeminarId = 5 // this would normally be loaded from elsewhere, obviously
};
db.Meetings.Add(meeting);
// meeting.Webinar is still null
db.Entry(meeting).Reference(m => m.Webinar).Load();
// meeting.Webinar is populated