关于EF codefirst ORM对数据插入时的奇怪问题

morliz子轩 自由职业 ERP程序员  2021-05-11 12:31:44
业务背景:
有以下两个DB数据表结构:

/*==============================================================*/
/* Table: Branch */
/*==============================================================*/
create table Branch (
BranchId int identity,
Branno nvarchar(8) not null,
Branna nvarchar(30) not null,
Principal nvarchar(8) null,
Preno nvarchar(8) null,
ScopeId uniqueidentifier null,
Branpath nvarchar(200) null,
Brantype tinyint null,
Bransrc int null,
constraint PK_Branch primary key nonclustered (BranchId),
constraint AK_Branno unique clustered (Branno)
)


/*==============================================================*/
/* Table: SysUser */
/*==============================================================*/
create table SysUser (
UserId int identity,
Logno nvarchar(16) not null,
Userna nvarchar(8) not null,
Userlev tinyint null,
Usertype tinyint null,
Valid bit not null default (1),
Valdate datetime null,
Pwd nvarchar(512) null,
Branno nvarchar(8) not null,
Jobno nvarchar(8) null,
Manno nvarchar(8) null,
Creater nvarchar(8) null,
Createdt datetime null,
Remark nvarchar(40) null,
Projno nvarchar(14) null,
Fingdt nvarchar(1500) null,
Imgfile nvarchar(30) null,
Mailaddr nvarchar(200) null,
Locked bit null,
Lockdate datetime null,
Lockman nvarchar(8) null,
Telno nvarchar(15) null,
Pwdtype tinyint null default (0),
constraint PK_SysUser primary key nonclustered (UserId),
constraint AK_Logno unique (Logno)
)


在DAL层,实现的方法是这样的:

/// <summary>
/// 部门信息新增
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static bool AddBranch(Branch obj)
{
try
{
int result = 0;
using(CusProContext db = new CusProContext())
{
db.Branch.Add(obj);
result = db.SaveChanges();
}

return result != 0 ? true : false;
}
catch(Exception ex)
{
throw ex;
}
}

/// <summary>
/// 注册新账号信息
/// </summary>
/// <param name="sysUser"></param>
/// <returns></returns>
public static bool ExecUserSave(SysUser userinfo)
{
try
{
int result = 0;
using (CusProContext db = new CusProContext())
{
db.SysUser.Add(userinfo);
result = db.SaveChanges();
}

return result != 0 ? true : false;
}
catch (Exception ex)
{
throw ex;
}
}


通过Sqlserver Profiler跟踪执行结果看:

exec sp_executesql N'
INSERT [dbo].[Branch](
[Branno],
[Branna],
[Principal],
[Preno],
[ScopeId],
[Branpath],
[Brantype],
[Bransrc]
)
VALUES (@0, @1, @2, @3, @4, @5, @6, @7)
SELECT [BranchId]
FROM [dbo].[Branch]
WHERE @@ROWCOUNT > 0 AND [BranchId] = scope_identity()',N'@0 nvarchar(8),@1 nvarchar(30),@2 nvarchar(8),@3 nvarchar(8),@4 uniqueidentifier,@5 nvarchar(200),@6 tinyint,@7 int',@0=N'007-3',@1=N'有要地在工',@2=N'122334',@3=N'007',@4='B64F4F5F-F18B-428A-97BC-D8E8EE59ACBE',@5=N'华特公司\研发中心\有要地在工',@6=2,@7=0

exec sp_executesql N'
INSERT [dbo].[SysUser](
[Logno],
……
)
VALUES (
@0,
@1,
……
)
SELECT [UserId] FROM [dbo].[SysUser]
WHERE @@ROWCOUNT > 0
AND [UserId] = scope_identity()',
N'@0 nvarchar(16),
@1 nvarchar(8),
@2 tinyint,
……
@15 tinyint',

@0=N'090124',
@1=N'龙磊',
……
@14=N'',


产生的结果居然会是这样:


我是真没明白,同时的表结构方式,同样的DAL写入方式。
一张表,插到了记录顶行,一张表,插在父级部门所在的行尾。而这个【ID】自增值,又大相径庭……
请大神求解!
...全文
56 点赞 收藏 1
写回复
1 条回复
morliz子轩 05月11日
这个问题,我已经改了两个地方: 表结构: UserId int identity(1,1) not null, constraint PK_SysUser primary key (UserId), 拿掉了nonclustered,数据插入就正常了。 但要说原因,我也说不上来。别的表,也是相同的表结构,唯一不同的就是没有nonclustered。 不知道因为设成了非簇聚集,是不是会引发EF的异常情况。搞不懂
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告