C# 外键未更新(配置为所需的主体相关)

C# 外键未更新(配置为所需的主体相关),c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,Fluent API配置: internal class UserMap : EntityTypeConfiguration<User> { public UserMap() { Property(x => x.CSL).IsRequired(); //relational properties HasRequired(x => x.UserType).Wit

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);
        }
    }
在数据库中插入一个用户后,对于TimelineVolumetry,我得到user_ID=0。添加用户时是否有自动设置用户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;
        }
    }

我认为在人际关系的配置方面有一些可以改进的地方。首先,您不需要两次配置用户和TimelineVolumetry之间的关系,一次就足够了。此外,您不需要使用级联删除配置关系。如果依赖实体上的外键不像您的情况那样是可为空的,那么代码首先在关系上设置cascade delete,因此已经设置了它

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();
    }
}
这将在数据库中正确插入两个实体,包括外键列的值

使现代化 恐怕您想要的是不可能的。您无法创建与未声明为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

如果您想了解有关此主题的更多信息,我建议您这样做。

外键仍为0。但该值来自DB中的TimelineVolumetries表或TimelineVolumetry实体中的FK属性?能否显示TimelineVolumetry实体以查看其属性?
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;
    }
}
// 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