实体框架中外键关系的空值

时间:2018-01-25 14:27:01

标签: c# asp.net asp.net-mvc entity-framework ef-code-first

我正在创建一个简单的寄存器模块。我能够通过SQL Management Studio成功插入数据,但是当试图运行应用程序时,它获得了一个空值ref。 UserxId为0但配置设置为Identity,我不确定为什么AccessLevel为null。代码非常简单,单元工作和通用存储库是标准的。

属性:

public class Userx
    {
        public int UserxId { get; set; }
        public int Access_Level_ID { get; set; }
        public virtual AccessLevel AccessLevel { get; set; }
        public string username { get; set; }
        public string password { get; set; }


    }

配置:

public class UserxConfig : EntityTypeConfiguration<Userx>
    {
        public UserxConfig()
        {
            ToTable("Userx");
            HasKey(x => new { x.UserxId, x.Access_Level_ID });

            Property(x => x.UserxId)
                .HasColumnName("UserxId")
                .HasColumnType(SqlDbType.Int.ToString())
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

            Property(x => x.Access_Level_ID)
             .HasColumnName("Access_Level_ID")
             .HasColumnType(SqlDbType.Int.ToString())
             .IsRequired();

            HasRequired(x => x.AccessLevel)
                .WithMany()
                .HasForeignKey(x => x.Access_Level_ID)
                .WillCascadeOnDelete(false);

        }
    }

以下是控制器的代码

[HttpPost]
        public ActionResult Registers(Userx userx)
        {

                if (ModelState.IsValid)
                {
                    using (var scope = new TransactionScope())
                    {
                        var encryptedPw = CustomEncrypt.Encrypt(userx.password);
                        var user = new Userx
                        {
                            Access_Level_ID = userx.Access_Level_ID,
                            username = userx.username,
                            password = userx.password
                        };
                        _unitOfWork.UserxRepository.Insert(user);
                        _unitOfWork.Save();
                        scope.Complete();
                    }
                }
                else
                {
                    ModelState.AddModelError("", "One or more fields have been");
                }

            return View();
        }

视图是自动生成的。

sample value while debugging, after the line, null value exception appears.

基本上我有两个问题,

  1. 为什么UserxId 0实际应该是自动生成并自动递增
  2. AccessLevel应该有价值吗?我相信该属性用于映射外键。
  3. 更新: AccessLevel的属性:

    public class AccessLevel
        {
            public int Access_Level_ID { get; set; }
            [Required]
            public string Level { get; set; }
            [Required]
            public string Description { get; set; }
        }
    

    配置:

    public class AccessLevelConfig : EntityTypeConfiguration<AccessLevel>
        {
            public AccessLevelConfig()
            {
                ToTable("AccessLevel");
                HasKey(x => x.Access_Level_ID);
    
                Property(x => x.Access_Level_ID)
                    .HasColumnName("Access_Level_ID")
                    .HasColumnType(SqlDbType.Int.ToString())
                    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            }
        }
    

    的DataContext:

    public DbSet<AccessLevel> AccessLevel { get; set; }
            public DbSet<Userx> Userx { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Configurations.Add(new AccessLevelConfig());
                modelBuilder.Configurations.Add(new UserxConfig());
                base.OnModelCreating(modelBuilder);
            }
    

    Null Value Reference Exception Screenshot

    FIX: UserxRepository返回null值ref。异常。

    在:

     private readonly UnitOfWork _unitOfWork;
    
           public AuthController(UnitOfWork unitOfWork;)
            {
                _unitOfWork = unitOfWork;
            }
    

    后:

    private readonly UnitOfWork _unitOfWork;
    
           public AuthController()
            {
                _unitOfWork = new UnitOfWork;
            }
    

    我试图在之前的代码上完成的是通过在构造函数中使用 UnitOfWork 依赖类来创建抽象,因此该对象将被预先实例化。

2 个答案:

答案 0 :(得分:-1)

public class Userx
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)] //TELL EF TO AUTOGENERATE ID
        public int UserxId { get; set; }
        public int? Access_Level_ID { get; set; } //MAKE ACCESS_LEVEL_ID NULLABLE
        public virtual AccessLevel AccessLevel { get; set; }
        public string username { get; set; }
        public string password { get; set; }
    }

答案 1 :(得分:-2)

在UserxId上定义Userx表的主键。它会自动生成自动增量标识。

public class Userx
    {
        [Key] //TELL EF TO AUTOGENERATE ID
        public int UserxId { get; set; }
        public int? Access_Level_ID { get; set; } //MAKE ACCESS_LEVEL_ID NULLABLE
        public virtual AccessLevel AccessLevel { get; set; }
        public string username { get; set; }
        public string password { get; set; }
    }