播种数据时出现DbUpdateException

时间:2014-06-24 12:21:44

标签: c# entity-framework code-first

我尝试使用自己的管理员用户帐户填充我的代码第一个数据库,以便我可以访问系统。

为此,我在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>添加的:

code-first database diagram

1 个答案:

答案 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方法中提供值可以解决问题。