【问题标题】:Duplicate entries using ASP.NET MVC 4, Entity Framework & SQL Server使用 ASP.NET MVC 4、实体框架和 SQL Server 的重复条目
【发布时间】:2015-10-07 08:20:58
【问题描述】:

我继承了一个使用 Entity Framework 的 ASP.NET MVC 4 应用程序,并不断在相关表上获取重复记录。我一直无法弄清楚为什么会发生这种情况,而且它只是随机发生的。

模型如下:

  • Company -> 有很多 Users -> 有很多 UserRoles
  • UserRoles 引用了具有RoleIdNameRoles 表。

它正在复制Roles 表中的条目。我一直在尝试解决这个问题,但对 EF 和其中一些还是很陌生。

UserRole.cs部分类:

public static bool UpdateUserRoles(int userId, List<int> roleIds) 
{
        using (var context = new ImageTrackerEntities()) 
        {
            var userRoles = context.UserRoles.Where(r => r.UserId == userId).ToList();

            foreach (var role in userRoles)
            {
                // do not remove users from super admin role
                context.Entry(role).State = EntityState.Deleted;
            }

            foreach (var id in roleIds) 
            {
                var ur = new UserRole() {
                    RoleId = id,
                    UserId = userId
                };

                context.Entry(ur).State = EntityState.Added;
            }

            context.SaveChanges();
            return true;
        }
    }

【问题讨论】:

  • 你能显示分配用户角色的代码吗?这是否发生在数据库中的多个位置?您可以通过在角色表上添加唯一约束来防止它发生。
  • 调试有没有发现什么?
  • 我不能让它经常发生,但在生产中它发生的频率越来越高。
  • 它有什么规律吗?
  • 这是唯一修改角色的地方吗?另外,您可以在任何地方重命名/编辑角色吗?

标签: c# sql-server asp.net-mvc entity-framework duplicates


【解决方案1】:

要更准确地注意发生了什么,请尝试激活 EF Log,以便查看生成的 SQL(如果您使用的是 EF6(当然是当前版本))。像这样的:

using (var context = new BlogContext()) 
{ 
    //YOU NEED TO ADD THIS
    context.Database.Log = Console.Write; 

    var blog = context.Blogs.First(b => b.Title == "One Unicorn"); 

    blog.Posts.First().Title = "Green Eggs and Ham"; 

    blog.Posts.Add(new Post { Title = "I do not like them!" }); 

    context.SaveChanges(); 
}

这将生成以下输出:

SELECT TOP (1)
    [Extent1].[Id] AS [Id],
    [Extent1].[Title] AS [Title]
    FROM [dbo].[Blogs] AS [Extent1]
    WHERE (N'One Unicorn' = [Extent1].[Title]) AND ([Extent1].[Title] IS NOT NULL)
-- Executing at 7/17/2015 10:55:41 AM -07:00
-- Completed in 4 ms with result: SqlDataReader

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多