首页 新闻 赞助 找找看

EF数据库初始化时提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 (SQLEditors)”

0
悬赏园豆:20 [已解决问题] 解决于 2013-12-24 17:20

在做一个练习的过程中,用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
View Code
mczxmin的主页 mczxmin | 初学一级 | 园豆:196
提问于:2013-12-24 14:47
< >
分享
最佳答案
0

好的解决办法是先搞清楚,“其中有一个表在打开的时候”中的“打开”的具体含义是什么。

收获园豆:20
Launcher | 高人七级 |园豆:45045 | 2013-12-24 15:15

打开的意思:在数据库中展开的这个表,提示这个信息,其他的表展开的时候没问题,就是这个表有问题。

mczxmin | 园豆:196 (初学一级) | 2013-12-24 15:33

@清风吹过的日子: 是用的 Sql Server Management Studio 吗?应该是创建表的过程问题。通过 Sql Server Management Studio 把表删除,然后通过 SQL 语句按照你的代码中的定义执行一次表创建,然后看看是否有错。

Launcher | 园豆:45045 (高人七级) | 2013-12-24 15:45

@Launcher:我用的数据库是SQL2008, 用SQL 语句执行一次,没有报错,之前没遇到过这样问题

mczxmin | 园豆:196 (初学一级) | 2013-12-24 15:50

@清风吹过的日子: 你在表上面点右键,然后生成 Create SQL 语句保存下来,然后用你的 EF 创建表,打开数据库后,别展开表,还是在表上面点击右键,然后生成 Create SQL,对比下。

Launcher | 园豆:45045 (高人七级) | 2013-12-24 15:55

@Launcher: 我刚才直接在报错的那个表上用SQL语句查询,查询的结果与表的结构有很大的区别,查询出来的数据中有很多字段是我表中没定义的,例如有个字段sid:值为0x0105000000000009040000008C68EF527DEF9C40B3838EDC1AD91D1F,我看的一头雾水,不知道这个sid从哪里来的。(我这边不能上传图片,如果有图片显示的就一目了然了,还请包涵,博客正在申请中。。^_^)

mczxmin | 园豆:196 (初学一级) | 2013-12-24 16:22

@清风吹过的日子: SID(Security Identifier),安全标识符。你能把你创建表的代码贴出来吗?

Launcher | 园豆:45045 (高人七级) | 2013-12-24 16:30

@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; }

    }
mczxmin | 园豆:196 (初学一级) | 2013-12-24 16:38

@清风吹过的日子: 把 SysUser 改个名字,修改为 User 。

Launcher | 园豆:45045 (高人七级) | 2013-12-24 16:41

@Launcher: 非常感谢,现在可以了。为什么命名成SysUser会出错,与数据库中其他表有冲突吗?

mczxmin | 园豆:196 (初学一级) | 2013-12-24 16:53

@清风吹过的日子: 是的,有冲突,而且我觉得不是生成了 SysUser 表,而是使用了迁移功能对数据库中已经存在的 SysUser 表了做了更新。如果你实现了 DbMigrationsConfiguration<T>的话,你可以在构造函数中将 AutomaticMigrationsEnabled 和 AutomaticMigrationDataLossAllowed 都设置为 false,再启动项目,那么它有可能报异常,报告数据库架构不同,并禁止了迁移。

Launcher | 园豆:45045 (高人七级) | 2013-12-24 16:57

@Launcher: 非常感谢,谢谢您耐心的解答,辛苦您了

mczxmin | 园豆:196 (初学一级) | 2013-12-24 17:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册