1

我有一個場景,我需要手動插入一個用戶,角色& UsersInRoles條目到數據庫中而不使用ASP.NET成員資格。現在,當我嘗試插入多對多關係UsersInRoles我得到下面的異常實體框架5 - 插入數據到UsersInRoles多對多表

Invalid column name 'Role_RoleId'. 

我使用EF 5,數據庫先用波蘇斯方法。我已經定義在EDMX關聯,這樣應該沒問題......這裏的模型實體

/// <summary> 
/// No Metadata Documentation available. 
/// </summary> 
[DataContract(IsReference = true)] 
[KnownType(typeof(User))] 
public partial class User : IUser 
{ 
    #region Primitive Properties 
    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [DataMember]  
    public virtual System.Guid ApplicationId 
    { 
     get; 
     set; 
    } 
    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [DataMember]  
    public virtual System.Guid UserId 
    { 
     get; 
     set; 
    } 
    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [DataMember]  
    public virtual string UserName 
    { 
     get; 
     set; 
    } 
    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [DataMember]  
    public virtual bool IsAnonymous 
    { 
     get; 
     set; 
    } 
    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [DataMember]  
    public virtual System.DateTime LastActivityDate 
    { 
     get; 
     set; 
    } 

    #endregion 

    #region Navigation Properties 
    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [NotMapped] 
    public virtual IMembership Membership 
    { 
     get { return _membership; } 
     set 
     { 
      if (!ReferenceEquals(_membership, value)) 
      { 
       var previousValue = _membership; 
       _membership = value; 
       FixupMembership(previousValue); 
      } 
     } 
    } 
    private IMembership _membership; 
    /// <summary> 
    /// Gets or sets the roles associated with an user 
    /// </summary> 
    [DataMember]  
    public virtual ICollection<Role> Roles 
    { 
     get 
     { 
      if (_roles == null) 
      { 
       _roles = new FixupCollection<Role>(); 
      } 
      return _roles; 
     } 
     set 
     { 
      _roles = value; 
     } 
    } 
    private ICollection<Role> _roles; 

    #endregion 

    #region Association Fixup 

    private void FixupMembership(IMembership previousValue) 
    { 
     if (previousValue != null && ReferenceEquals(previousValue.User, this)) 
     { 
      previousValue.User = null; 
     } 

     if (Membership != null) 
     { 
      Membership.User = this; 
     } 
    } 

    #endregion 

} 

注意:這是從用戶到角色

/// <summary> 
/// No Metadata Documentation available. 
/// </summary> 
[DataContract] 
[KnownType(typeof(Role))] 
public partial class Role : IRole 
{ 
    #region Primitive Properties 
    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [DataMember]  
    public virtual System.Guid ApplicationId 
    { 
     get; 
     set; 
    } 
    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [DataMember]  
    public virtual System.Guid RoleId 
    { 
     get; 
     set; 
    } 
    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [DataMember]  
    public virtual string RoleName 
    { 
     get; 
     set; 
    } 
    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [DataMember]  
    public virtual string Description 
    { 
     get; 
     set; 
    } 

    #endregion  

} 

工作代碼

單向關係
MyContext context = new MyContext(); 

Role usersRole = new Role(); 
usersRole.RoleName = "Users"; 
usersRole.Description = "User Role"; 
usersRole.RoleId = GuidExtension.NewSequentialGuid(); 
usersRole.ApplicationId = application.Id; 

//Init users 
User adminUser = new User(); 
adminUser.UserName = "admin"; 
adminUser.IsAnonymous = false; 
adminUser.LastActivityDate = DateTime.UtcNow; 
adminUser.UserId = GuidExtension.NewSequentialGuid(); 
adminUser.ApplicationId = application.Id; 
//Init user roles 
adminUser.Roles.Add(usersRole); 

context.User.Add(adminUser); 
context.SaveChanges(); 

我也嘗試將角色添加到數據庫中,然後添加一個用戶(沒有添加角色到角色集合),我得到同樣的例外。然後,我添加模型通過流利的API這樣的結合:

modelBuilder.Entity<User>() 
       .HasMany(u => u.Roles) 
       .WithMany() 
       .Map(m => 
       { 
        m.MapLeftKey("UserId"); 
        m.MapRightKey("RoleId"); 
        m.ToTable("UsersInRoles"); 
       }); 

,我也嘗試添加結合這樣的:上面的代碼

exec sp_executesql N'insert [dbo].[Roles]([RoleId], [ApplicationId], [RoleName], [Description]) 
values (@0, @1, @2, @3) 
',N'@0 uniqueidentifier,@1 uniqueidentifier,@2 nvarchar(max) ,@3 nvarchar(max) ',@0='46E39982-E490-4F79-B457-A1AB012948CE',@1='79D75E2D-9923-48DC-A4D6-AE0CED0EDD58',@2=N'Users',@3=N'User Role' 

exec sp_executesql N'insert [dbo].[Users]([UserId], [ApplicationId], [UserName], [IsAnonymous], [LastActivityDate], [Role_RoleId]) 
values (@0, @1, @2, @3, @4, null) 
',N'@0 uniqueidentifier,@1 uniqueidentifier,@2 nvarchar(max) ,@3 bit,@4 datetime2(7)',@0='B5EA5052-71C9-411E-91C7-A1AB012948CF',@1='79D75E2D-9923-48DC-A4D6-AE0CED0EDD58',@2=N'admin',@3=0,@4='2013-04-25 14:14:08.4930381' 
另外這裏

modelBuilder.Entity<User>() 
      .HasMany(u => u.Roles) 
      .WithMany() 
      .Map(m => 
      { 
       m.MapLeftKey("UserId"); 
       m.MapRightKey("RoleId"); 
       var mapping = m.ToTable("UsersInRoles"); 
       mapping.MapLeftKey("UserId"); 
       mapping.MapRightKey("RoleId"); 
      }); 

是SQL跟蹤

上面你可以看到問題的來源,[Role_RoleId]列中的用戶插入SQL,所以我不知道我是否有正確的安裝導航屬性?

無論我做什麼,我都會得到上述例外,就像Fluent API綁定被忽略。有誰知道如何正確地將許多條目添加到UsersInRoles表中或者我的代碼中缺少什麼。

注意:我是EF新手,所以任何信息都可能有幫助。

UPDATE 我試圖只保存用戶錄入到數據庫中,我也得到相同的[Role_roleID成爲]例外,希望這能澄清這個問題有點多,因爲這也許不是一個許多人很多插入問題,而是無效的多對多配置問題?

問候

回答

0

我已經發現了兩個問題,在我的代碼,很長很長的代碼審查後,第一個問題是「隱藏」在叫我的部分類的一個屬性

public virtual ICollection<User> Members { get; set; } 

在那裏作爲複製粘貼錯誤,我無法找到它,因爲它處於摺疊區域,我正在查找Users屬性,因爲這是我之前生成的導航項的名稱。

第二個問題是一個更嚴重的問題,它涉及到「數據庫」。SetInitializer」,DB初始化放入

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    Database.SetInitializer<CoreDALContext>(null); 
} 

這是錯誤的,這應該只調用一次,並把在靜態構造函數按照微軟的實現。

static CoreDALContext() 
{ 
    Database.SetInitializer<CoreDALContext>(null); 
} 

我希望這將有助於其他EF新人不要讓我犯同樣的錯誤。

Regards