2015-07-17 4 views
0

Я унаследовал приложение ASP.NET MVC 4, которое использует Entity Framework и продолжает получать дубликаты записей по связанным таблицам. Я не смог понять, почему это происходит, и это происходит только случайным образом.Повторяющиеся записи с использованием ASP.NET MVC 4, Entity Framework и SQL Server

модели являются такие:

  • Company -> имеет много Users -> имеет много UserRoles
  • UserRoles ссылки В настоящем Roles таблицу, которая имеет RoleId и Name.

Это дублирующие записи в таблице 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; 
     } 
    } 
+3

Не могли бы вы показать код, в котором роли пользователя назначены? Это происходит в нескольких местах в базе данных? Вы можете предотвратить его, добавив уникальное ограничение в таблицу ролей. – DavidG

+0

Вы нашли что-нибудь, отлаживая его? –

+0

Я не могу заставить это случиться обычно, но в производстве это происходит все чаще и чаще. – CWitty

ответ

0

Заметить случено более точно, попробуйте активировать EF Вход, так что вы можете увидеть 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