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();