实体框架多对多关系避免导致错误

本文关键字:错误 关系 框架 实体 | 更新日期: 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)。

有一个解决方法:写第一个项目将外键列中的空,然后用第一个项目的键写第二个项目。最后用第二个项中的键更新第一个项。

您可以考虑更改应用程序的设计来避免这种情况。