我有一個場景,我需要手動插入一個用戶,角色& 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成爲]例外,希望這能澄清這個問題有點多,因爲這也許不是一個許多人很多插入問題,而是無效的多對多配置問題?
問候