简体   繁体   English

无法将嵌套对象保存在实体框架中

[英]Can't save nested object in entity framework

I'm new in Asp.Net MVC. 我是Asp.Net MVC的新手。 I use standart Membership provider in my project. 我在我的项目中使用了标准会员资格提供程序。 I have Application User and ApplicationDbContext 我有应用程序用户和ApplicationDbContext

  public class ApplicationUser : IdentityUser
    {
    [Required]
        public virtual UserInfo UserInfo { get; set; }
        public virtual ICollection<Lot> Lots { get; set; }
    }

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public DbSet<Lot> Lots { get; set; }
        public DbSet<Product> Products { get; set; }

        public DbSet<UserInfo> UserInfoes { get; set; }

        public DbSet<PersonalInformation> PersonalInformations { get; set; } 
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }
    }

and UserInfo 和UserInfo

public class UserInfo
    {
        [Key]
        public int UserInfoId { get; set; }
        public DateTime RegistarationDate { get; set; }
        public decimal Money { get; set; }
        public decimal CurrentDebt { get; set; }
        public virtual PersonalInformation PersonalInformation { get; set; }
        public virtual ApplicationUser ApplicationUser { get; set; }
    }

Personal Information 个人信息

 public class PersonalInformation
    {
        public int PersonalInformationId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Telephone { get; set; }
        public Adress Adress { get; set; }
    }

my RegisterViewModel 我的RegisterViewModel

public class RegisterViewModel
    {
        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }

        public string FirstName { get; set; }
        public string LastName { get; set; }
        public decimal Money { get; set; }

        public string Telephone { get; set; }
    }

and action create in controller 和动作在控制器中创建

 [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser()
                {
                    UserName = model.UserName,
                    UserInfo = new UserInfo()
                    {
                        CurrentDebt = 0,
                        Money = model.Money,
                        RegistarationDate = DateTime.Now,
                        PersonalInformation = new PersonalInformation()
                        {
                            FirstName = model.FirstName,
                            LastName = model.LastName,
                            Telephone = model.Telephone,
                        }
                    }
                };
                var result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    await SignInAsync(user, isPersistent: false);
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    AddErrors(result);
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

And when I fill all fields that're mentioned in action, i receivee this error 当我填写行动中提到的所有字段时,我收到此错误

Cannot insert the value NULL into column 'UserInfoId', table 'DefaultConnection.dbo.UserInfoes'; 无法将值NULL插入表'DefaultConnection.dbo.UserInfoes'的'UserInfoId'列中; column does not allow nulls. 列不允许为空。 INSERT fails. INSERT失败。 The statement has been terminated. 该语句已终止。

Could anybody help me? 有人可以帮我吗? Thanks a lot 非常感谢

You need to tell EF that UserInfoId is a Key against the table so it maps it as an Identity . 您需要告诉EF UserInfoId是针对该表的Key ,因此它将其映射为Identity

Something like this would work in a mapping file: 这样的事情将在映射文件中起作用:

public class UserInfoMap : EntityTypeConfiguration<UserInfo>
{
    public UserInfoMap()
    {
        ToTable("UserInfo");
        HasKey(m => m.UserInfoId );
    }
}

When the code first migration runs, it generates something like this: 当代码首次迁移运行时,它会生成如下内容:

CreateTable(
    "dbo.UserInfo",
    c => new
        {
            UserInfoId = c.Int(nullable: false, identity: true)
)

which means you won't need to specify the Id as it will auto populate in the database. 这意味着您无需指定ID,因为它会自动填充到数据库中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM