Мне нужно, чтобы mantain обрушил свойство в родительском объекте, принадлежащем дочернему объекту, на два уровня вниз. Я использую EF6 с Code First и DataAnnotations в приложении Asp.Net/MVC.Как иметь свойство в родительском объекте, чье значение принадлежит дочернему объекту, два уровня вниз с EF6 и Code-First
Наличие этих entitites:
public class Parent
{
[Key]
public int IdParent {get; set;}
// ...other properties
//The value of this property belongs to the Child table, two levels down.
public int Status { get; set; }
public Intermediate Intermediate { get; set; }
}
public class Intermediate
{
[Key, ForeignKey("Parent")]
public int IdIntermediate { get; set;}
// ... other properties
public Parent Parent { get; set; }
public Child Child { get; set; }
}
public class Child
{
[Key, ForeignKey("Intermediate")]
public int IdChild { get; set; }
//...other properties
public int Status { get; set; } // This is the property I need to keep updated in Parent Class
public Intermediate Intermediate { get; set; }
}
Статус недвижимости в Родитель дает пользователю быстрый просмотр результата процесса, выполняемого на ребенка, который содержит детальную информацию о выполнении.
Я оцениваю это решение, буду признателен за ваши рекомендации относительно того, какой из них более подходящий или другое лучшее решение.
Вариант 1: создать триггер в базе данных, чтобы обновить поле в родительской таблице. Этот параметр будет создавать более чистый код в моих сущностях, но для создания триггера требуется создать изолированную миграцию, поскольку он должен быть командой SQL, и его трудно поддерживать.
public partial class AddUpdateTriggerOnChildMigration : DbMigration { public override void Up() { Sql("CREATE OR REPLACE TRIGGER [Child_UpdateStatus] FOR UPDATE ON dbo.Child..."); } public override void Down() { Sql("DROP TRIGGER [Child_UpdateStatus]"); } }
Вариант 2: Для того, чтобы держать в поле только в детской таблице и сделать свойство Status вычисленный на родительский объект. Но я не знаю, как заставить это работать с DataAnnotations или с Fluent API.
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] public int Status { get; private set; }
Вариант 3: Для того, чтобы NotMapped свойство Parent.Status и заполнить его с помощью кода из детского лица. Это кажется худшим решением, и его также трудно поддерживать, и оно не будет работать, если объект не привязан к контексту.
public class Parent { public int IdParent { get; set; } // ... [NotMapped] public int? Status { get { return this.Intermediate == null ? null : this.parent.Intermediate.Child.Status; } } public Intermediate Intermediate { get; set; } }
вы проверили мой ответ? – user449689
Да @ user449689. Я выбрал вариант 1, триггер на таблице «Дети», созданный в изолированной миграции. На данный момент это сработало, потому что у меня нет родительских объектов в памяти. Я расскажу о событиях домена в будущей версии, чтобы решить проблему сущностей в памяти. Благодаря! – Lupa
Большое спасибо за ваши отзывы, пожелания – user449689