实体框架多对多关系避免导致错误
本文关键字:错误 关系 框架 实体 | 更新日期: 2023-09-27 18:11:30
我看过各种SO问题,但找不到一个类似于我的情况。我有下面的EF模型生成的类
public partial class Resource
{
public Resource()
{
this.Roles = new HashSet<Role>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Role> Roles { get; set; }
}
public partial class Role
{
public Role()
{
this.Resources = new HashSet<Resource>();
this.Users = new HashSet<User>();
}
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Nullable<bool> Active { get; set; }
public virtual ICollection<Resource> Resources { get; set; }
public virtual ICollection<User> Users { get; set; }
}
public aysnc Task<int> SaveRelationship(params)
{
var db = GetContext();
var role = await db.Roles.FirstOrDefaultAsync(...);
var resource = await db.Resources.FirstOrDefaultAsync(...);
role.Resources.Add(resource);
//tried these one at a time as well as together
resource.Roles.Add(role);
return await db.SaveChangesAsync();
}
我得到错误INSERT语句与FOREIGN KEY约束冲突..
它生成/执行的SQL查询是:我知道这个语句不会运行,我能做些什么来改变它生成正确的语句?
exec sp_executesql N'INSERT [Config].[RoleResourceAllocations]([RoleId])
VALUES (@0)
SELECT [ResourceId]
FROM [Config].[RoleResourceAllocations]
WHERE @@ROWCOUNT > 0 AND [ResourceId] = scope_identity() AND [RoleId] = @0',N'@0 int',@0=1
这是我的表
CREATE TABLE [Config].[RoleResourceAllocations]
(
[ResourceId] [int] IDENTITY(1,1) NOT NULL,
[RoleId] [int] not null,
CONSTRAINT [FK_RoleResourceAllocations_Roles]
FOREIGN KEY ([RoleId]) REFERENCES [Identity].[Roles]([Id]),
CONSTRAINT [FK_RoleResourceAllocations_Resources]
FOREIGN KEY ([ResourceId]) REFERENCES [Config].[Resources]([Id]),
CONSTRAINT [PK_RoleResourceAllocations]
PRIMARY KEY ([RoleId], [ResourceId])
)
这是一个典型的设置,所以您应该没有任何问题。
[配置]。[RoleResourceAllocations] .ResourceId
应该不是是标识列,因为您从
获得该值[配置]。[资源]。[Id]
列。
我的另一个建议是让它作为同步工作,然后玩弄异步的东西
如果你试图同时写一个新的角色和一个新的资源,并且两个表都有一个外键约束,它将每次抛出一个错误,因为外键还不存在于数据库中的任何一个项目(至少使用Oracle)。
有一个解决方法:写第一个项目将外键列中的空,然后用第一个项目的键写第二个项目。最后用第二个项中的键更新第一个项。
您可以考虑更改应用程序的设计来避免这种情况。