EntityFramework, получение идентификатора объекта при добавлении в таблицу - PullRequest
1 голос
/ 18 апреля 2019

У меня есть вопрос.Я добавляю объект в свою таблицу следующим образом:

this.db.Objects.Add(new Object { Text = "someText", Number = number });

Затем я хочу добавить второй объект в другую таблицу, связанную с таблицей Objects (имя таблицы Objects3)

this.db.Objects3.Add(new Object3 { ObjectId = ?, Property = "text" });

Как получить Object.Id (идентификатор в таблице имеет тип int), основываясь только на свойствах объекта?

Таблица выглядит так:

public class Object
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("Object2")]
    public int Object2Id { get; set; }
    public Object2 Object2 { get; set; }

    public string Text { get; set; }
    public int Number { get; set; }

    public List<Object3> Objects3 { get; set; }
}

public class Object3
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("Object")]
    public int ObjectId { get; set; }
    public Object Object { get; set; }

    public string Property { get; set; }
}

1 Ответ

2 голосов
/ 18 апреля 2019

На самом деле вам не нужны значения идентификаторов для создания отношений между двумя объектами, вот где поддержка ORM для свойств навигации становится удобной:

var o1 = new Object() { ...
var o3 = new Object3() { ...

o3.Object = o1;

this.db.Objects3.Add( o3 );

this.db.SaveChanges();

EF должен заметить, что у вашего свойства навигации есть объект на другом конце, и сохранить его в базе данных в правильном порядке, и установить оба идентификатора соответствующим образом.

Однако, если вы настаиваете на наличии идентификатора в явном виде, вы должны сначала сохранить изменения, чтобы идентификатор был установлен в объекте

var o1 = new Object() { ...
this.db.Objects.Add( o1 );

this.db.SaveChanges(); 

var id = o1.ID;

Теперь вы можете использовать свой идентификатор в явном виде.

Дополнительное замечание - в ваших навигационных свойствах отсутствует модификатор virtual, это делает невозможным для EF заменить реализацию по умолчанию на реализацию с отложенной загрузкой для объектов, которые материализуются при выполнении запросов к базе данных.

public class Object
{
    public Object()
    {
        this.Objects3 = new List<Object3>();
    }

    public virtual ICollection<Object3> Objects3 { get; set; }
}

public class Object3
{
    public virtual Object Object { get; set; }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...