实体框架在新创建的实体上使用导航属性

时间:2011-11-01 16:16:58

标签: c# .net entity-framework entity-framework-4.1

我的公司有一种方法可以通过电子邮件创建MailMessage。我使用的方法获取一个Email对象作为参数,这是一个简单的POCO对象,已经设置了ToId和FromId等外键属性。该实体还具有EmailAddress实体的导航属性(FromEmailAddress和ToEmailAddress)。

我想要实现的是使用这些导航属性。我能够做到这一点的方式如下,但它看起来像一个hax:

    public MailMessage CreateEmail(Email email)
    {
        var tmpEmail = db.Set<Email>().Create();
        db.Emails.Add(tmpEmail);
        db.Entry<Email>(tmpEmail).CurrentValues.SetValues(email);
        db.SaveChanges(); 
        email = tmpEmail;

然后我在我的代码中使用该电子邮件。这样实体现在有一个代理,所以我可以使用导航属性。有没有更简单的方法呢?

1 个答案:

答案 0 :(得分:1)

在我看来,这是一个很好的解决方案,可以启用延迟加载。另一种方法是明确加载导航属性。然后您不需要创建代理:

public MailMessage CreateEmail(Email email)
{
    db.Emails.Add(email);
    db.SaveChanges();

    db.Entry(email).Reference(e => e.FromEmailAddress).Load();
    db.Entry(email).Reference(e => e.ToEmailAddress).Load();

    //...
}

它创建了两个到数据库的往返 - 当您使用延迟加载并访问导航属性时相同。