外键未更新(使用所需的依赖主体进行配置)

本文关键字:主体 依赖 配置 更新 | 更新日期: 2024-09-23 08:14:10

Fluent API配置:

internal class UserMap : EntityTypeConfiguration<User>
    {
        public UserMap()
        {
            Property(x => x.CSL).IsRequired();
            //relational properties
            HasRequired(x => x.UserType).WithMany(x => x.Users).HasForeignKey(x => x.UserType_ID).WillCascadeOnDelete(true);
            HasRequired(x => x.TimelineVolumetry).WithRequiredPrincipal(x => x.User).WillCascadeOnDelete(true);           
        }
    }
internal class TimelineVolumetryMap : EntityTypeConfiguration<TimelineVolumetry>
    {
        public TimelineVolumetryMap()
        {
            Property(x => x.AllowedWeeks).IsRequired();
            //relational properties
            HasRequired(x => x.User).WithRequiredDependent(x => x.TimelineVolumetry).WillCascadeOnDelete(true);
        }
    }

插入查询:

User u = new User();
u.CSL = csl;
u.UserType_ID = role;
u.TimelineVolumetry = new TimelineVolumetry();
u.TimelineVolumetry.User = u;
ctx.User.Add(u);
ctx.SaveChanges();

在数据库中插入一个用户之后,我得到了TimelineVolumetryUser_ID = 0。有没有办法在添加用户时自动设置User_ID,或者在设置外键后我是否被迫再次保存TimelineVolumetry

public class TimelineVolumetry
    {
        public int ID { get; set; }
        public int AllowedWeeks { get; set; }
        //relational properties
        public int User_ID { get; set; }
        public User User { get; set; }
        public TimelineVolumetry()
        {
            AllowedWeeks = 0;
        }
    }

外键未更新(使用所需的依赖主体进行配置)

我看到了一些可以在关系配置中改进的地方。首先,您不需要两次配置UserTimelineVolumetry之间的关系,一次就足够了。此外,您不需要使用级联删除来配置关系。如果依赖实体上的外键不可为null(就像您的情况一样),则Code First会在关系上设置级联删除,因此已经设置了它

public class UserMap : EntityTypeConfiguration<User>
{
    public UserMap()
    {
        Property(x => x.CSL).IsRequired();
        //relational properties
        HasRequired(x => x.UserType).WithMany(x => x.Users).HasForeignKey(x => x.UserType_ID);
        HasRequired(x => x.TimelineVolumetry).WithRequiredPrincipal(x => x.User);           
    }
}
public class TimelineVolumetryMap : EntityTypeConfiguration<TimelineVolumetry>
{
    public TimelineVolumetryMap()
    {
        Property(x => x.AllowedWeeks).IsRequired();
    }
}

关于插入,如果你同时创建两个实体,你应该这样做:

User u = new User();
//...
var tv= new TimelineVolumetry();
//set required properties of TimelineVolumetry entity
u.TimelineVolumetry =tv;
//u.TimelineVolumetry.User = u;// you don't need to do this
//...
ctx.User.Add(u);
ctx.SaveChanges();

这将在DB中正确插入两个实体(包括外键列的值)。

更新

恐怕你想要的是不可能的。你不能与未声明为PK的FK创建一对一关系,实体框架要求依赖项的主键也是外键,所以,为了实现你想要的,你可以这样做:

public class TimelineVolumetry
{
    public int AllowedWeeks { get; set; }
    //relational properties
    [Key, ForeignKey("User")]
    public int User_ID { get; set; }
    public User User { get; set; }
    public TimelineVolumetry()
    {
        AllowedWeeks = 0;
    }
}

这是使用数据注释,但使用Fluent Api是这样的:

// Configure User_Id as PK for TimelineVolumetry
    modelBuilder.Entity<TimelineVolumetry>()
        .HasKey(e => e.User_Id);
  // Configure User_Id as FK for TimelineVolumetry
    modelBuilder.Entity<User>()
                .HasOptional(s => s.TimelineVolumetry) // Mark TimelineVolumetry is optional for User
                .WithRequired(ad => ad.User); // Create inverse relationship

如果你想阅读更多关于这个主题的内容,我推荐你这个链接。