在做一个练习的过程中,用EF Code First生成数据库,数据库也生成成功了,但是其中有一个表在打开的时候提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 (SQLEditors)”这样的提示信息,不知道各位大侠碰到这种情况没有,有没有什么好的解决方法?
另外:我用SQL语句生成这个报错的表能展开看到表中的数据,生成这个表的语句如下:
CREATE TABLE [dbo].[SysUsers1]( [ID] [int] IDENTITY(1,1) NOT NULL, [NiceName] [nvarchar](20) NULL, [Pwd] [nvarchar](16) NULL, [Sex] [nvarchar](6) NULL, [Phone] [nvarchar](14) NULL, [Email] [nvarchar](max) NULL, [Address] [nvarchar](40) NULL, [Status] [nvarchar](12) NULL, [PwdQues] [nvarchar](20) NULL, [PwdAnswer] [nvarchar](40) NULL, [Name] [nvarchar](max) NULL, [CreateTime] [datetime] NOT NULL, PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
好的解决办法是先搞清楚,“其中有一个表在打开的时候”中的“打开”的具体含义是什么。
打开的意思:在数据库中展开的这个表,提示这个信息,其他的表展开的时候没问题,就是这个表有问题。
@清风吹过的日子: 是用的 Sql Server Management Studio 吗?应该是创建表的过程问题。通过 Sql Server Management Studio 把表删除,然后通过 SQL 语句按照你的代码中的定义执行一次表创建,然后看看是否有错。
@Launcher:我用的数据库是SQL2008, 用SQL 语句执行一次,没有报错,之前没遇到过这样问题
@清风吹过的日子: 你在表上面点右键,然后生成 Create SQL 语句保存下来,然后用你的 EF 创建表,打开数据库后,别展开表,还是在表上面点击右键,然后生成 Create SQL,对比下。
@Launcher: 我刚才直接在报错的那个表上用SQL语句查询,查询的结果与表的结构有很大的区别,查询出来的数据中有很多字段是我表中没定义的,例如有个字段sid:值为0x0105000000000009040000008C68EF527DEF9C40B3838EDC1AD91D1F,我看的一头雾水,不知道这个sid从哪里来的。(我这边不能上传图片,如果有图片显示的就一目了然了,还请包涵,博客正在申请中。。^_^)
@清风吹过的日子: SID(Security Identifier),安全标识符。你能把你创建表的代码贴出来吗?
@Launcher: 好的,多谢大侠了。
public class SynDataContext : DbContext { public SynDataContext() : base("name=DataContext") { } public DbSet<Fruit.Fruit> Fruit { set; get; } public DbSet<SysUser> SysUsers { set; get; } public DbSet<Role> Roles { set; get; } public DbSet<Function> Functions { set; get; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Fruit.Fruit>() .HasOptional(c => c.Parent)//HasOptional 可选的 Required 必选的、Many 多个 .WithMany(c => c.Childrens) .HasForeignKey(c => c.ParentID); modelBuilder.Entity<Function>() .HasOptional(c => c.Parent) .WithMany(c => c.Childrens) .HasForeignKey(c => c.ParentID); modelBuilder.Entity<SysUser>() .HasMany(c => c.Roles).WithMany(c => c.Users) .Map(m => { m.ToTable("UserRole"); m.MapLeftKey("UserID"); m.MapRightKey("RoleID"); } ); modelBuilder.Entity<Function>() .HasMany(c => c.Roles).WithMany(c => c.Functions) .Map(m => { m.ToTable("RoleFunction"); m.MapLeftKey("FunctionID"); m.MapRightKey("RoleID"); } ); } }
public class SysUser : BaseModel { /// <summary> /// 昵称 /// </summary> [StringLength(20)] public string NiceName { set; get; } /// <summary> /// 密码 /// </summary> [StringLength(16)] public string Pwd { set; get; } /// <summary> /// 性别 /// </summary> [StringLength(6)] public string Sex { set; get; } /// <summary> /// 联系电话 /// </summary> [StringLength(14)] public string Phone { set; get; } /// <summary> /// 注册邮箱 /// </summary> public string Email { set; get; } /// <summary> /// 地址 /// </summary> [StringLength(40)] public string Address { set; get; } /// <summary> /// 状态(0:禁用 1:活动) /// </summary> [StringLength(12)] public string Status { set; get; } /// <summary> /// 密码提示问题 /// </summary> [StringLength(20)] public string PwdQues { set; get; } /// <summary> /// 密码提示答案 /// </summary> [StringLength(40)] public string PwdAnswer { set; get; } public virtual List<Role> Roles { set; get; } }
@清风吹过的日子: 把 SysUser 改个名字,修改为 User 。
@Launcher: 非常感谢,现在可以了。为什么命名成SysUser会出错,与数据库中其他表有冲突吗?
@清风吹过的日子: 是的,有冲突,而且我觉得不是生成了 SysUser 表,而是使用了迁移功能对数据库中已经存在的 SysUser 表了做了更新。如果你实现了 DbMigrationsConfiguration<T>的话,你可以在构造函数中将 AutomaticMigrationsEnabled 和 AutomaticMigrationDataLossAllowed 都设置为 false,再启动项目,那么它有可能报异常,报告数据库架构不同,并禁止了迁移。
@Launcher: 非常感谢,谢谢您耐心的解答,辛苦您了