Добавление объекта без знания родительского идентификатора - PullRequest
0 голосов
/ 04 декабря 2018

Мне нужно вставить новую сущность, не зная, что это PK.У родительского объекта есть еще одно свойство - guid и уникальное свойство, которое мы используем для перекрестных ссылок на БД, и это все, что у меня есть.Я делал это в прошлом, но не могу найти ссылку на то, как сделать это снова.

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

1 Ответ

0 голосов
/ 04 декабря 2018

Что ж, PK ссылочной сущности требуется , чтобы правильно установить FK ссылочной сущности.

Если у вас его нет, очевидно, вы должны его найти(получить его из базы данных) в зависимости от того, что у вас есть (вторичный идентификатор в вашем случае).Например:

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

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

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

Нет способа заставить это работать без извлечения.Если вы не хотите извлекать всю ссылочную сущность (и уверены, что она не отслеживается контекстом), вы можете извлечь только PK и Attach заглушку:

var schoolId = context.Schools.Where(e => e.ExternalId == externalId)
    .Select(e => e.Id).Single();
var school = new School( Id = schoolId);
context.Attach(school);
// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...