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