我尝试使用自己的管理员用户帐户填充我的代码第一个数据库,以便我可以访问系统。
为此,我在Global.asax文件中调用Seed
方法执行以下操作:
public void Seed()
{
if (!Roles.Any())
{
List<Role> roles = new List<Role>
{
new Role { RoleName = "Admin" },
new Role { RoleName = "User" }
};
foreach (Role r in roles)
{
Roles.Add(r);
}
SaveChanges();
}
if (!Users.Any())
{
User u = new User();
u.EmailAddress = "my@email.address";
u.Username = "ortund";
u.Password = Hashing.CreateHash("p455W0rd");
u.Role = Roles.Single(r => r.RoleName == "Admin");
Users.Add(u);
SaveChanges();
}
}
用户和角色定义如下:
namespace Logan.Web.Objects
{
public class User : LoganBaseObject<User>
{
public string Username { get; set; }
public string EmailAddress { get; set; }
public string Password { get; set; }
public string Biography { get; set; }
public virtual Role Role { get; set; }
public virtual ICollection<Article> Articles { get; set; }
public User()
{
Username = String.Empty;
EmailAddress = String.Empty;
Password = String.Empty;
Biography = String.Empty;
Articles = new List<Article>();
}
}
}
public class Role : LoganBaseObject<Role>
{
public string RoleName { get; set; }
public virtual ICollection<User> Users { get; set; }
public Role()
{
RoleName = String.Empty;
Users = new List<User>();
}
}
}
namespace Logan.Web.DBContext
{
public class RoleDBContext : LoganDBBaseObject<Role>
{
private static WebDBContext db = new WebDBContext();
public RoleDBContext()
: base()
{
Property(p => p.RoleName)
.HasColumnName("sRoleName")
.IsRequired();
HasMany(m => m.Users)
.WithRequired();
ToTable("Roles");
}
}
public class UserDBContext : LoganDBBaseObject<User>
{
private static WebDBContext db = new WebDBContext();
public UserDBContext()
: base()
{
Property(p => p.Username)
.HasColumnName("sUsername")
.HasMaxLength(20)
.IsRequired();
Property(p => p.EmailAddress)
.HasColumnName("sEmailAddress")
.HasMaxLength(200)
.IsRequired();
Property(p => p.Password)
.HasColumnName("sPassword")
.HasMaxLength(255)
.IsRequired();
Property(p => p.Biography)
.HasColumnName("sBiography")
.HasColumnType("text");
HasRequired(r => r.Role)
.WithMany(m => m.Users)
.Map(x => x.MapKey("fkRoleID"))
.WillCascadeOnDelete(false);
Property(p => p.CreateDate)
.HasColumnType("datetime");
ToTable("Users");
}
}
}
当上面的Seed
方法到达SaveChanges()时,我收到以下错误:
保存不公开其关系的外键属性的实体时发生错误。 EntityEntries属性将返回null,因为无法将单个实体标识为异常源。通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常。有关详细信息,请参阅InnerException。
显然,这与这里正在构建的关系有关,但我实际上并不知道我做错了什么。
有人可以推荐解决方案和/或解释问题所在吗?
提前致谢!
编辑
这是一个发电的结构截图。 PKey字段是从LoganBaseObject<T>
添加的:
答案 0 :(得分:0)
我真的需要学习绝对包含表格中的所有信息。
我在User表中有一些datetime列,我没有在Seed
方法中提供值。见这里:
public class User : LoganBaseObject<User>
{
public string Username { get; set; }
public string EmailAddress { get; set; }
public string Password { get; set; }
public string Biography { get; set; }
public virtual Role Role { get; set; }
public bool PasswordReset { get; set; }
public string PasswordResetKey { get; set; }
public DateTime ResetExpiry { get; set; }
public string CreatedBy { get; set; }
public DateTime CreateDate { get; set; }
}
我仍然不知道为什么缺失值会产生关于外键的错误,但在Seed方法中提供值可以解决问题。