引用查找实体而不添加新实体
本文关键字:实体 新实体 查找 引用 添加 | 更新日期: 2023-09-27 18:00:17
我有两个EF实体:
public partial class CustomerEntity
{
public int CustomerId { get; set; }
public string CustomerName { get; set; }
public virtual ICollection<RoleEntity> Roles { get; set; }
}
public partial class RoleEntity
{
public int RoleId { get; set; }
public string RoleName { get; set; }
}
这是我的插入方法:
public int? InsertCustomer(CustomerEntity customer)
{
_context.CustomerEntities.Add(customer);
try
{
return _context.SaveChanges();
}
catch (DbEntityValidationException exception)
{
return null;
}
}
这是创建新客户的方法:
public int CreateNewCustomer(string Name)
{
// Some mapping to CustomerEntity
var _customerEntity = new CustomerEntity
{
CustomerName = Name,
Roles = new List<RoleEntity>
{
new RoleEntity
{
RoleId = 1
}
}
};
return InsertCustomer(_customerEntity);
}
RoleEntity是一个"查找"表,意味着它有预设记录,永远不会有新记录。
每次创建新的CustomerEntity时,它都将具有一个或多个角色。如何在不在数据库中创建新角色的情况下插入新的CustomerEntity?我上面的CreateNewCustomer方法将在数据库中插入新的Customer和新的Role,而我只想要其角色引用数据库中现有Role(id为1)的新Customer。
如上所述,您可以从数据库加载角色并将其添加到客户的Roles
集合中,但您也可以将"新"角色用作存根对象(无需进行数据库往返):
public int CreateNewCustomer(string Name)
{
var role = new RoleEntity { RoleId = 1 };
AttachEntity(role); // role is "Unchanged" now
// Some mapping to CustomerEntity
var customerEntity = new CustomerEntity
{
CustomerName = Name,
Roles = new List<RoleEntity>{ role } // Will not set role to "Added"
};
return InsertCustomer(customerEntity);
}
我假设CreateNewCustomer
在某种具有DbContext
实例的存储库中。AttachEntity
除了将实体附加到上下文之外什么也不做:
void AttachEntity<T>(T entity)
{
this._context.Set<T>().Attach(entity);
}
您可以从_content加载Role实体,并将对象分配给_customerEntity。
public int? InsertCustomer(CustomerEntity customer, int roleId)
{
var role =_context.Roles.Find(customer);
_customerEntity Roles = new List<RoleEntity>{ role };
return _context.SaveChanges();
}
只需获取要分配给该客户的RoleEntity
,并将其直接添加到客户ICollection
。