我想更新一个记录类型图,它修改了内部也有的父对象和子对象。当子项的 EF UPDATE 注册表将它们设置为 NULL 时,通常会出现此问题,其中子项有助于识别您正在更新的记录。
我的域类是:
此类帮助我更改状态,添加 - 自定义 - 删除,这是从父级作为所有子级的图表。使它工作的功能。
public interface IObjectWthState
{
State State { get; set; }
}
public enum State
{
Added,
Unchanged,
Modified,
Deleted
}
这是一个用户类:
public abstract class User : IObjectWthState
{
public int Id { get; set; }
public String Name { get; set; }
public String LastName { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
[NotMapped]
public State State { get; set; }
}
这是从用户继承的两个类:
public class AdminUser:User
{
public ICollection<BasicUser> UsersList { get; set; }
public String Email { get; set; }
}
public class BasicUser: User
{
public String Position { get; set; }
public String Department { get; set; }
}
正如所见 AdminUser BasicUser 有一个列表。
该模型是根据需要生成的,需要检测外键并添加。这是数据库的图片:
这是添加或更新信息的函数:
public virtual void AddUpdateGraph(T entity)
{
if (((IObjectWthState)entity).State == State.Added)
{
DbEntityEntry dbEntityEntry = dbContext.Entry(entity);
dbEntityEntry.State = EntityState.Added;
}
else
{
dbSet.Add(entity);
dbContext.ApplyStateChanges();
}
}
处理 go 和调整内部节点状态的函数:
public static void ApplyStateChanges(this DbContext context)
{
foreach (var entry in context.ChangeTracker.Entries<IObjectWthState>())
{
IObjectWthState stateInfo = entry.Entity;
entry.State = StateHelpers.ConvertState(stateInfo.State);
}
}
将状态返回给 EF 的函数:
public static EntityState ConvertState(State state)
{
switch (state)
{
case State.Added:
return EntityState.Added;
case State.Modified:
return EntityState.Modified;
case State.Deleted:
return EntityState.Deleted;
default:
return EntityState.Unchanged;
}
}
当您想用他的列表 BasicUser 添加一个新的 AdminUser 时,一切正常,没有问题,当您想修改 EF BasicUser AdminUser 并为 BasicUser 生成更新但添加了外键为空的条件时,问题就来了。
在这里你可以看到生成的两个更新
管理员用户:
exec sp_executesql N'update [dbo].[User]
set [Name] = @0, [LastName] = @1, [Email] = @2
where (([Id] = @3) and ([RowVersion] = @4))
select [RowVersion]
from [dbo].[User]
where @@ROWCOUNT > 0 and [Id] = @3',N'@0 nvarchar(max) ,@1 nvarchar(max) ,@2 nvarchar(max) ,@3 int,@4 binary(8)',@0=N'Beto',@1=N'Guerere',@2=N'beto@gmail.com',@3=3,@4=0x0000000000000801
基本用户:
exec sp_executesql N'update [dbo].[User]
set [Name] = @0, [LastName] = @1, [Position] = @2, [Department] = @3, [AdminUser_Id] = @4
where ((([Id] = @5) and ([RowVersion] = @6)) and [AdminUser_Id] is null)
select [RowVersion]
from [dbo].[User]
where @@ROWCOUNT > 0 and [Id] = @5',N'@0 nvarchar(max) ,@1 nvarchar(max) ,@2 nvarchar(max) ,@3 nvarchar(max) ,@4 int,@5 int,@6 binary(8)',@0=N'Viomar',@1=N'Guerere',@2=N'Supervisora',@3=N'Ventas',@4=3,@5=4,@6=0x0000000000000802
正如您在 EF 生成的 SQL 命令中看到的那样,添加了对 BasicUser 进行更新的记录条件具有 Null 值到 AdminUser_Id。我不明白这是为什么。该字段不能为空,因为该用户已分配给主管。
我希望我解释了。
非常感谢你能给我的任何帮助。