使用 entity framework 插入时设置 Id 字段
Set Id field when inserting using entity framework
当 Id 具有某个设定值(例如 6)时,使用 Entity framework 尝试插入实体(整个图是正确的)时出现错误。
它有它是因为它存储在另一个数据库中,我可以为列表中的每个元素以及子列表中的每个元素等手动设置它。但是我必须为每个元素和每个查询执行此操作。
我希望采用独特的全局方式将 Id 字段设置为零,因为当我尝试插入值时出现错误:
Cannot insert explicit value for identity column in table 'XXX' when IDENTITY_INSERT is set to OFF.
我希望我的数据库设置 ID,并使 entity framework 忽略 Id 设置为 0 以外的任何值
我尝试过 ovveride OnSaveChanges,但似乎晚了,因为当使用 Add 或 AddRange 方法时,对象开始被跟踪,我无法将 Id 设置为列表中的多个对象。
在 EF Core 3.x 中,您可以处理 ChangeTracker.Tracked 事件并显式重置为每个 Added
实体设置自动生成的 PK,就像这样(它不需要在外部,您可以将数据库上下文自行附加到该事件):
dbContext.ChangeTracker.Tracked += (sender, e) =>
{
if (!e.FromQuery && e.Entry.State == EntityState.Added && e.Entry.IsKeySet)
{
var pk = e.Entry.Metadata.FindPrimaryKey();
if (pk.Properties.Count == 1)
{
var pkProperty = pk.Properties[0];
if (pkProperty.ValueGenerated == ValueGenerated.OnAdd &&
defaultValues.TryGetValue(pkProperty.ClrType, out var defaultValue))
{
e.Entry.State = EntityState.Detached;
e.Entry.CurrentValues[pkProperty] = defaultValue;
var newEntry = e.Entry.Context.Entry(e.Entry.Entity);
newEntry.State = EntityState.Added;
}
}
}
};
其中 defaultValues
是一个字典,其中包含支持的自动递增 属性 类型的盒装 0
(零)值(如果需要,您可以添加更多):
static readonly Dictionary<Type, object> defaultValues = new Dictionary<Type, object>
{
{ typeof(int), default(int) },
{ typeof(long), default(long) },
{ typeof(decimal), default(decimal) },
};
但请注意,这不会修复在没有参考导航的情况下使用显式 FK 属性的关系 属性。
当 Id 具有某个设定值(例如 6)时,使用 Entity framework 尝试插入实体(整个图是正确的)时出现错误。 它有它是因为它存储在另一个数据库中,我可以为列表中的每个元素以及子列表中的每个元素等手动设置它。但是我必须为每个元素和每个查询执行此操作。 我希望采用独特的全局方式将 Id 字段设置为零,因为当我尝试插入值时出现错误:
Cannot insert explicit value for identity column in table 'XXX' when IDENTITY_INSERT is set to OFF.
我希望我的数据库设置 ID,并使 entity framework 忽略 Id 设置为 0 以外的任何值
我尝试过 ovveride OnSaveChanges,但似乎晚了,因为当使用 Add 或 AddRange 方法时,对象开始被跟踪,我无法将 Id 设置为列表中的多个对象。
在 EF Core 3.x 中,您可以处理 ChangeTracker.Tracked 事件并显式重置为每个 Added
实体设置自动生成的 PK,就像这样(它不需要在外部,您可以将数据库上下文自行附加到该事件):
dbContext.ChangeTracker.Tracked += (sender, e) =>
{
if (!e.FromQuery && e.Entry.State == EntityState.Added && e.Entry.IsKeySet)
{
var pk = e.Entry.Metadata.FindPrimaryKey();
if (pk.Properties.Count == 1)
{
var pkProperty = pk.Properties[0];
if (pkProperty.ValueGenerated == ValueGenerated.OnAdd &&
defaultValues.TryGetValue(pkProperty.ClrType, out var defaultValue))
{
e.Entry.State = EntityState.Detached;
e.Entry.CurrentValues[pkProperty] = defaultValue;
var newEntry = e.Entry.Context.Entry(e.Entry.Entity);
newEntry.State = EntityState.Added;
}
}
}
};
其中 defaultValues
是一个字典,其中包含支持的自动递增 属性 类型的盒装 0
(零)值(如果需要,您可以添加更多):
static readonly Dictionary<Type, object> defaultValues = new Dictionary<Type, object>
{
{ typeof(int), default(int) },
{ typeof(long), default(long) },
{ typeof(decimal), default(decimal) },
};
但请注意,这不会修复在没有参考导航的情况下使用显式 FK 属性的关系 属性。