Entity framework 插入具有实体框架的父实体时插入从属实体

Entity framework 插入具有实体框架的父实体时插入从属实体,entity-framework,Entity Framework,插入父实体时,插入从属实体的记录时出现问题。下面是我的实体定义和映射 电子用户 public partial class EBUser : ModelBase, IUser<long> { public string UserName { get; set; } public string Password { get; set; } public long AccountId { get; set; } public EBAccount EbAcco

插入父实体时,插入从属实体的记录时出现问题。下面是我的实体定义和映射

电子用户

public partial class EBUser : ModelBase, IUser<long>
{
    public string UserName { get; set; }
    public string Password { get; set; }
    public long AccountId { get; set; }
    public EBAccount EbAccount { get; set; }
    public string Email { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime? LastUpdateDate { get; set; }

    public virtual EBUserInfo UserInfo { get; set; }
}
EBUserMapping

public class EBUserMapping : BaseEntityMapping<EBUser>
{
    public EBUserMapping()
    {
        this.ToTable("Users");
        this.Property(u => u.AccountId).HasColumnName("AccountId");
        this.Property(u => u.Password).HasColumnName("Password");
        this.Property(u => u.UserName).HasColumnName("UserName");
        this.Property(u => u.Email).HasColumnName("Email");
        this.Property(u => u.CreatedDate).HasColumnName("CreatedDate");
        this.Property(u => u.LastUpdateDate).HasColumnName("LastUpdateDate").IsOptional();

        //this.HasRequired(u => u.UserInfo).WithRequiredDependent(u => u.User);
        this.HasRequired(t => t.EbAccount)
            .WithMany(t => t.Users)
            .HasForeignKey(d => d.AccountId);
    }
}
公共类EBUserMapping:BaseEntityMapping { 公共EBUserMapping() { 本表为ToTable(“用户”); this.Property(u=>u.AccountId).HasColumnName(“AccountId”); this.Property(u=>u.Password).HasColumnName(“密码”); this.Property(u=>u.UserName).HasColumnName(“用户名”); this.Property(u=>u.Email).HasColumnName(“Email”); this.Property(u=>u.CreatedDate).HasColumnName(“CreatedDate”); this.Property(u=>u.LastUpdateDate).HasColumnName(“LastUpdateDate”).IsOptional(); //this.HasRequired(u=>u.UserInfo)。WithRequiredDependent(u=>u.User); this.HasRequired(t=>t.EbAccount) .WithMany(t=>t.Users) .HasForeignKey(d=>d.AccountId); } } EBUserInfoMapping

public class EBUserInfoMapping :BaseEntityMapping<EBUserInfo>
{
    public EBUserInfoMapping()
    {
        this.ToTable("UserInfo");
        this.Property(u => u.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        this.Property(u => u.Email).HasColumnName("Email");
        this.Property(u => u.FirstName).HasColumnName("FirstName");
        this.Property(u => u.LastName).HasColumnName("LastName");
        this.Property(u => u.DisplayName).HasColumnName("DisplayName");

        // Relationships
        this.HasRequired(t => t.User).//WithRequiredDependent(t => t.UserInfo);
        WithOptional(t => t.UserInfo);
    }
}
公共类EBUserInfoMapping:BaseEntityMapping { 公共EBUserInfoMapping() { 此.ToTable(“用户信息”); this.Property(u=>u.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(u=>u.Email).HasColumnName(“Email”); this.Property(u=>u.FirstName).HasColumnName(“FirstName”); this.Property(u=>u.LastName).HasColumnName(“LastName”); this.Property(u=>u.DisplayName).HasColumnName(“DisplayName”); //关系 this.HasRequired(t=>t.User)。//WithRequiredDependent(t=>t.UserInfo); with可选(t=>t.UserInfo); } } 在数据库模式中,所有表都有一个ID列,但在
EBUserInfor
类中,
ID
列是
EBUsers
表的主键和外键

BaseEntityuMapping
映射
Id
列,并将
DatabaseGenerationOptions
设置为
identity
,但在
EBUserinfoMapping
类I中,使用
DatabaseGenerationOption
DatabaseGenerationOption
覆盖该选项

当我使用实体框架插入新的
EBUser
记录时,会创建用户记录,但不会创建
userInfo
记录

请帮忙


谢谢

将用户映射到用户信息

EBuser user= new EBuser();
// fill here user
EBuserInfo info = new EBuserInfo();
Info.userInfo= user;
// fill here rest info
db.add(info);
db.saveChanges();

因此,将依赖实体而不是主体添加到数据库中要创建的两个记录的上下文中?不幸的是,这不起作用。查看生成的SQL,只生成了依赖实体的insert语句(UserInfo),导致外键约束冲突,因为id为0,并且在调用save UserRecord操作时不能是视图中的标识列。然后,您必须将来自视图的模型值映射到实体框架生成的实体。在控制器上,您必须将用户数据映射到用户类型的userinfo.user属性。因此,首先从视图映射用户实体中的所有值,然后将该用户放入userinfo.user entity add最后保存它。请参考此链接,与您的场景相同,希望它能帮助您解决问题。根据帖子,我必须创建麻烦依赖实体和主体实体的实例,将主体指定给依赖项的导航属性,然后在保存之前将依赖项和主体添加到上下文中。这是一个准确的评估吗?为什么您放弃了带有RequiredDependent(t=>t.UserInfo)部分的
?这正是您在这里需要的映射。这是我设置的第一个属性,但是在插入用户对象时,依赖UserInfor的属性仍然没有插入。我现在想我需要插入UserInfo对象,让EntityFramework自动插入主体。我会尝试,并更新这个线程,如果它工作没有工作使用与RequiredDependent或与OptionalWell,我不明白你到底做什么和什么是“不工作”的意思。两者之间的唯一映射应该是
this.HasRequired(t=>t.User)。WithRequiredDependent(t=>t.UserInfo)
(或WithOptional)。“不工作”表示在保存用户对象时未创建UserInfo记录。当我从上下文检索用户对象时,userInfo对象被水合,当我检索userInfo对象时,user对象被水合。当我尝试插入用户对象时,userinfo对象不会持久化,当我尝试插入userinfo对象时,它会失败,因为ef不会尝试首先创建用户对象以获取将用于userinfo对象主键的Id,因此插入userinfo对象会因外键冲突而失败
EBuser user= new EBuser();
// fill here user
EBuserInfo info = new EBuserInfo();
Info.userInfo= user;
// fill here rest info
db.add(info);
db.saveChanges();