如何完全构造新添加的实体

时间:2015-03-15 12:48:09

标签: c# entity-framework

在我的项目中,我需要将销售线索添加到数据上下文中。销售人员用户添加了潜在客户,我需要将电子邮件发送给负责人的经理。

    public partial class Lead
{
    public Lead()
    {
        this.LeadActivities = new HashSet<LeadActivity>();
    }

    public long LeadID { get; set; }
    public System.DateTime CreatedAt { get; set; }
    public long CompanyID { get; set; }
    public long ProductID { get; set; }
    public long CreatedByUserID { get; set; }
    public string Remarks { get; set; }
    public LeadStatusEnum StatusID { get; set; }

    public virtual Company Company { get; set; }
    public virtual Product Product { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<LeadActivity> LeadActivities { get; set; }
}

    [Serializable]
public partial class Person
{
    public Person()
    {
        this.Contacts = new HashSet<Contact>();
        this.Users = new HashSet<User>();
    }

    public long PersonID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Designation { get; set; }
    public Nullable<int> Gender { get; set; }
    public Nullable<int> Title { get; set; }
    public int StatusID { get; set; }
    public string Thumbnail { get; set; }
    public string Email { get; set; }

    public virtual ICollection<Contact> Contacts { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

在上面的实体中,我有通过CreatedByUserID与Person表相关联的属性UserID。当我添加新的潜在客户时,通过以下代码,用户字段保持为空。我需要重建吗?如果是,那么如何。

  

EDIT1   实体创建通过以下代码完成

                Entity = new Model.Lead
            {
                CreatedAt = DateTime.Now,
                CreatedByUserID = SessionManagement.GeneralSession.UserDetail.UserID
            };

        Entity.CreatedAt = Convert.ToDateTime(txtTimestamp.Value);
        Entity.CompanyID = Convert.ToInt64(ddlCompany.SelectedValue);
        Entity.CreatedByUserID = Convert.ToInt64(ddlUser.SelectedValue);
        Entity.ProductID = Convert.ToInt64(lstProducts.SelectedValue);
        Entity.Remarks = txtRemarks.Text;
        DataSource.Leads.Add(Entity);
        DataSource.SaveChanges();

1 个答案:

答案 0 :(得分:1)

Virtual lazy loading only works with proxy instances。由于您明确构建了Lead实体,因此在插入实体后延迟加载User导航属性将无效。

相反,您应该使用DbSet.Create方法来新建派生代理类型的实例。然后执行插入操作,该插入操作将附加到上下文中,延迟加载将随后工作。

或者,您可以使用现有的POCO,执行插入操作,然后使用DbSet.Find方法从DbSet获取插入的实体作为其代理。

您还应该检查并确保正确映射外键ID和导航属性,因为属性CreatedByUserIDUser不会按惯例自动关联。