Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 在不知道父id的情况下添加实体_Entity Framework_Entity Framework Core - Fatal编程技术网

Entity framework 在不知道父id的情况下添加实体

Entity framework 在不知道父id的情况下添加实体,entity-framework,entity-framework-core,Entity Framework,Entity Framework Core,我需要在不知道PK的情况下插入一个新实体。父实体有另一个属性,它是guid和唯一的,这是我们用来进行交叉db引用的,这就是我所拥有的全部。我过去做过,但找不到如何再次做的参考 [Table("School")] public class SchoolEntity { public SchoolEntity() { Students = new HashSet<StudentEntity>();

我需要在不知道PK的情况下插入一个新实体。父实体有另一个属性,它是guid和唯一的,这是我们用来进行交叉db引用的,这就是我所拥有的全部。我过去做过,但找不到如何再次做的参考

    [Table("School")]
    public class SchoolEntity
    {
        public SchoolEntity()
        {
            Students = new HashSet<StudentEntity>();
        }


        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Required]
        public Guid ExternalId { get; set; }

        [ForeignKey("SchoolId")]
        public virtual ICollection<StudentEntity> Students { get; set; }
    }

    [Table("Student")]
    public class StudentEntity
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Required]
        public SchoolEntity School { get; set; }
    }


    //ExternalId won't work cause is not the primary key.
    var school = new School { ExternalId = Guid.Parse('68e05258-550a-40f3-b68a-5d27a0d825a0') };

    context.Attach(school);
    context.Schools.Add.Add(new Student());
    context.SaveChanges();
[表格(“学校”)]
公立学校实体
{
公立学校实体()
{
学生=新HashSet();
}
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
[必需]
公共Guid外部ID{get;set;}
[外籍学生(“学号”)]
公共虚拟ICollection学生{get;set;}
}
[表(“学生”)]
公营班学生
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
[必需]
公立学校实体学校{get;set;}
}
//ExternalId不起作用,因为它不是主键。
var学校=新学校{ExternalId=Guid.Parse('68e05258-550a-40f3-b68a-5d27a0d825a0');
背景。附(学校);
context.Schools.Add.Add(new Student());
SaveChanges();

为了正确设置引用实体的FK,需要引用实体的PK

如果您没有它,显然您应该根据您所拥有的(您的案例中的辅助标识符)找到它(从数据库中获取)。例如:

var school = context.Schools.Single(e => e.ExternalId == externalId);

var student = new Student { School = school, ... };

context.Students.Add(student);
context.SaveChanges();

没有抓取,就没有办法让它工作。如果您不想获取整个引用的实体(并且您确定上下文没有跟踪它),那么您可以仅获取PK和
附加
存根实体:

var schoolId = context.Schools.Where(e => e.ExternalId == externalId)
    .Select(e => e.Id).Single();
var school = new School( Id = schoolId);
context.Attach(school);
// ...

密钥设置为标识列,因此保存实体时,EF将自动从DB获取ID。如果要将学生添加到学校,只需将其添加到学校的学生集合,EF将自动处理FK作业。(只要关系映射正确。)@StevePy我只有externalId,它不是主键。很明显,我可以像Ivan所说的那样将新实体添加到集合中或从数据库中检索父实体,但我不想避免这种情况。谢谢@Ivan,但这需要我获取实体,这不是一个选项。我记得这样做时不需要从数据库中获取实体,不确定是否使用EF扩展。。。不管怎样,谢谢。不带回执是不可能的。如果您不想获取整个实体,最起码的方法是获取它的PK,然后
附加
。我会用这个选项更新答案。你是说不可能在一个数据库调用中插入一个id等于动态执行的查询结果的实体?这很奇怪,因为我想我刚才真的这么做了,但我想你是对的。感谢如果您公开FK属性,则相关实体不必附加到上下文。@DevilSuichiro True,但OP不公开它(并且不要求在模型中公开FK)。不管是否附加,关键是必须提取:)