2016-11-14 6 views
0

Мне нужно, чтобы 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; } 
    } 
    
+0

вы проверили мой ответ? – user449689

+0

Да @ user449689. Я выбрал вариант 1, триггер на таблице «Дети», созданный в изолированной миграции. На данный момент это сработало, потому что у меня нет родительских объектов в памяти. Я расскажу о событиях домена в будущей версии, чтобы решить проблему сущностей в памяти. Благодаря! – Lupa

+0

Большое спасибо за ваши отзывы, пожелания – user449689

ответ

0

Я даю вам 4-й вариант: переопределить SaveChanges следующим образом:

public partial class MyDbContext : DbContext 
{ 
    public override int SaveChanges() 
    { 
     try 
     { 
      var changeSet = ChangeTracker.Entries<Child>(); 

      if (changeSet != null) 
      { 
       foreach (var entry in changeSet.Where(c => c.State == EntityState.Added || c.State == EntityState.Modified)) 
       { 
        // Update here the parent 
       } 
      } 

      return base.SaveChanges(); 
     } 
     catch (Exception exception) 
     { 

     } 
    } 
} 

Идея заключается в том, что, когда вы сохраните изменения своего контекста, петля над всеми субъектами тип Child, которые были добавлены или изменены, а затем вы можете правильно обновить имущество Status вашего Parent класс

 Смежные вопросы

  • Нет связанных вопросов^_^