修改这篇文章是否缺乏足够的信息来获得一些指导?
我有这种方法将实体插入数据库:
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'。
这些图片显示了我的意思:
检查我的实体
检查上下文
任何人都可以解释这种行为以及我能做些什么吗?
这是我班级的结构(为简洁而减少):
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}}表/列。
答案 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,但您从未将此分配给您的支持字段。