2014-11-06 6 views
1

Я новичок в EntityFramework. Мой код, как показано ниже.EntityFramework всегда создает новую запись таблицы отношений

User.cs

public User 
{ 
    public long Id { get; set; } 
    public long UserRoleId { get; set; } 
    public string Name { get; set; } 
    public virtual UserRole UserRole { get; set; } 
} 

public class UserMap : EntityTypeConfiguration<User> 
{ 
    public UserMap() 
    { 
     ToTable("User"); 
     HasKey(x => x.Id); 
     HasRequired(x => x.UserRole) 
      .WithMany(x => x.Users) 
      .HasForeignKey(x => x.UserRoleId); 
    } 
} 

UserRole.cs

public UserRole 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<User> Users { get; set; } 

    public UserRole() 
    { 
     Users = new List<User>(); 
    } 
} 

public class UserRoleMap : EntityTypeConfiguration<UserRole> 
{ 
    public UserRoleMap() 
    { 
     ToTable("UserRole"); 
     HasKey(x => x.Id); 
    } 
} 

Install.cs

public Install 
{ 
    public static void Install() 
    { 
     RpUserRoles.Create(new UserRole() { Name = "System" }); 
     RpUserRoles.Create(new UserRole() { Name = "Admin" }); 

     var roleSystem = RpUserRoles.Table.Where(x => x.Name.Equals("System")).FirstOrDefault(); 
     User userSystem = new User(); 
     userSystem.Name = "UserSystem"; 
     userSystem.UserRole = roleSystem; 
     RpUser.Create(userSystem); 

     var roleAdmin = RpUserRoles.Table.Where(x => x.Name.Equals("Admin")).FirstOrDefault(); 
     User userAdmin = new User(); 
     userAdmin.Name = "UserAdmin"; 
     userAdmin.UserRoleId = roleAdmin.Id; 
     RpUser.Create(userAdmin); 
    } 
} 

результат, который я получаю в база данных неверна, когда я создаю нового пользователя в базе данных. EntityFramework дублирует записи в таблице отношений. Результат, как

User 
| Id | UserRoleId | Name  | 
| 1 |   3 | UserSystem | 
| 2 |   2 | UserAdmin | 

UserRole 
| Id | Name | 
| 1 | System | 
| 2 | Admin | 
| 3 | System | 

Ожидаемое UserRoleId для UserSystem пользователя должно быть , но я не знаю, почему EntityFramework будет дублировать новую запись в таблице UserRole. Поскольку UserAdmin установить UserRoleId, тогда все должно быть в порядке. Могу ли я узнать, настроен ли я неправильно? Благодарю.

ответ

0

Это произойдет, если вы создали UserRole (то есть RpUserRoles.Create(new UserRole() { Name = "System" })) и извлекли его (RpUserRoles.Table.Where(x => x.Name.Equals("System")).FirstOrDefault()) из разных контекстов. Entity Framework не будет знать, что они одинаковые, поэтому он будет рассматривать второй, как если бы он был новым. Похоже, вы используете оболочку (RpUserRoles.Create, RpUserRoles.Table) вокруг Entity Framework; как он справляется с контекстом? Создает ли он один для каждого метода?

+0

да, обертка создать для каждого класса. Теперь я решил, вызвав контекст экземпляра. Огромное спасибо. –

0

ваш код должен быть таким образом

var roleSystem=RpUserRoles.Create(new UserRole() { Name = "System" }); 
    var rolAdmin=RpUserRoles.Create(new UserRole() { Name = "Admin" }); 
    //var roleSystem = RpUserRoles.Table.Where(x => x.Name.Equals("System")).FirstOrDefault(); 
    User userSystem = new User(); 
    userSystem.Name = "UserSystem"; 
    userSystem.UserRole = roleSystem; 
    RpUser.Create(userSystem); 

    //var roleAdmin = RpUserRoles.Table.Where(x => x.Name.Equals("Admin")).FirstOrDefault(); 
    User userAdmin = new User(); 
    userAdmin.Name = "UserAdmin"; 
    userAdmin.UserRoleId = roleAdmin.Id; 
    RpUser.Create(userAdmin); 

DbSet<T>.Create определения: Создает новый экземпляр объекта для типа этого множества. Обратите внимание, что этот экземпляр НЕ добавляется или не присоединяется к набору. Возвращаемый экземпляр будет прокси-сервером, если базовый контекст настроен на создание прокси, а тип объекта соответствует требованиям для создания прокси-сервера.

так я думаю, вы должны добавить также добавить roleSystem и roleAdmin в контексте

надеюсь, что это поможет вам

Смежные вопросы