EF Context在添加实体后不保留值

时间:2014-02-09 16:50:17

标签: entity-framework ef-code-first

修改这篇文章是否缺乏足够的信息来获得一些指导?

我有这种方法将实体插入数据库:

public void Insert(T entity)
{
    _context.Set<T>().Add(entity);
    _context.SaveChanges();
}

在将entity添加到上下文之前检查CustomerRole时,我的public class Customer : BaseEntity { public CustomerRole CustomerRole { get; set; } } class CustomerMap : EntityTypeConfiguration<Customer> { public CustomerMap() { HasRequired(t => t.CustomerRole) .WithMany(t => t.Customers); } } public class CustomerRole : BaseEntity { private ICollection<Customer> _customers; public ICollection<Customer> Customers { get { return _customers ?? (new List<Customer>()); } set { _customers = value; } } } 字段就在那里。添加完成后,上下文似乎没有。因此,我收到此错误:

  

'CcDataContext.Customers'中的实体参与了   'customer_CustomerRole'的关系。 0相关   找到了“Customer_CustomerRole_Target”。 1   预计会有'Customer_CustomerRole_Target'。

这些图片显示了我的意思:

检查我的实体 enter image description here

检查上下文 enter image description here

任何人都可以解释这种行为以及我能做些什么吗?

这是我班级的结构(为简洁而减少):

public Customer InsertGuestCustomer()
    {
        var customer = new Customer();
        CustomerRole guestRole = GetCustomerRoleByName("Guest");
        if (guestRole == null)
            throw new Exception("Customer Role is not defined!");
        customer.UserName = "";
        customer.EmailAddress = "";
        customer.Password = "";
        customer.IsAdmin = false;
        customer.CustomerRole = guestRole;
        _customerRepository.Insert(customer);
        return customer;
    }

我可以确认客户地图正在添加到配置中,我的数据库是按照它们构建的。

这是我正在进行的调用插入:

Customer

我的数据库中没有其他数据,这将是第一个客户记录,只有一个CustomerRole。我的CustomerRole.Id表有一个外键指向我的{{1}}表/列。

1 个答案:

答案 0 :(得分:1)

将导航属性标记为virtual,并在实体构造函数中初始化集合属性,而不是从属性getter初始化。

public class Customer : BaseEntity
{
    public virtual CustomerRole CustomerRole { get; set; }
}

...

public class CustomerRole : BaseEntity
{
    public CustomerRole()
    {
        Customers = new List<Customer>();
    }

    public virtual ICollection<Customer> Customers { get; protected set; }
}

在您的Customers属性中,当支持字段为空时,您在getter中返回了一个新List,但您从未将此分配给您的支持字段。