我正在创建一个简单的寄存器模块。我能够通过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.
基本上我有两个问题,
更新: 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 依赖类来创建抽象,因此该对象将被预先实例化。
答案 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; }
}