有什么办法可以禁用在实体框架中插入实体?
我正在使用 DDD,并且在特定的有界上下文中,用户表的某些必需的数据库字段没有意义(在此上下文中)。所以,我想从用户实体中删除它们,但这样做我失去了将新用户保存到数据库的能力。没关系,因为在这种情况下,我不应该创建用户。
我的第一个想法是禁用用户实体上的插入(但允许更新)。
可行吗?或者,对于这种情况还有其他解决方案吗?
有什么办法可以禁用在实体框架中插入实体?
我正在使用 DDD,并且在特定的有界上下文中,用户表的某些必需的数据库字段没有意义(在此上下文中)。所以,我想从用户实体中删除它们,但这样做我失去了将新用户保存到数据库的能力。没关系,因为在这种情况下,我不应该创建用户。
我的第一个想法是禁用用户实体上的插入(但允许更新)。
可行吗?或者,对于这种情况还有其他解决方案吗?
您不能禁用插入,但您可以查找是否有任何实体被标记为插入并在这种情况下触发异常。
进行此类处理的最佳位置是覆盖SaveChanges
方法:
public override int SaveChanges(SaveOptions options)
{
if (ObjectStateManager.GetObjectStateEntries(EntityState.Added)
.Where(e => !e.IsRelationship)
.Select(e => e.Entity)
.OfType<User>()
.Any())
{
throw new InvalidOperationException("User cannot be inserted");
}
return base.SaveChanges(options);
}
这是运行时行为,但因为 EF 在修改操作之间没有区别(都在 single 内SaveChanges
),所以您无法在编译时检测到插入。