2014-11-06 27 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 | 

UserSystem用戶預期UserRoleId應,但我不知道爲什麼會的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);它如何處理上下文?它是否爲每種方法創建一個?

+0

是的,包裝是建立一個爲每個類。現在我通過調用實例上下文來解決問題。非常感謝。 – 2014-11-06 21:23:38

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上下文

希望這將幫助你