2011-03-30 3 views
1

Je suis en train de réfléchir à la possibilité d'abandonner l'EF CTP5 dans le développement de la nouvelle application que je viens de commencer.Entity Framework CTP5 Recharger les entités liées

Voilà ma situation:

public class EnergieContext : DbContext, IEnergieContext 
{ 
    public EnergieContext() 
     : base("EnergieDatabase") 
    { 
     this.Configuration.ProxyCreationEnabled = false; 
    } 
protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<RegionUser>() 
      .Property(ru => ru.RegionUserID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    } 

    public DbSet<Region> Regions { get; set; } 
    public DbSet<RegionUser> RegionsUsers { get; set; } 

public class Region 
{ 
    public int RegionID { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<RegionUser> RegionUsers { get; set; } 
} 

public class RegionUser 
{ 
    [Key] 
    [Column(Order = 0)] 
    public int RegionUserID { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    public int RegionID { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public int ZicyzUserID { get; set; } 

    public DateTime? DateAllocated { get; set; } 

    public DateTime? DateRemoved { get; set; } 

    public bool IsActive { get; set; } 

    public virtual Region Region { get; set; }  

    [NotMapped] 
    public virtual Employee ZicyzUser { get; set; } 
} 

Mon but est de filtrer les utilisateurs inactifs, plutôt que de supprimer des entrées de la table je marque l'utilisateur supprimé comme inactif, à savoir IsActive = false; ...

I oBTENUS le filtrage comme celui-ci:

public Region GetRegionDetails(int regionID) 
    { 
     Region region = Regions.Where(r => r.RegionID == regionID).FirstOrDefault(); 

     Entry(region).Collection(r => r.RegionUsers).Query().Where(ru => ru.IsActive == true).Load(); 

     return region; 
    } 

cela remplirait la collection RegionUsers avec tous RegionUser entités qui sont marquées avec IsActive = true. Cela signifie que ceux qui sont marqués comme inactifs quitté notre :) de récupération

Cependant, si je décide de mettre à jour des RegionUser entités IsActive = false le changement se reflète dans la collection RegionUsers, mais le problème est que la collection contient encore l'élément que je souhaite filtrer.

J'ai lu que Entry(Regions).Reload() doit effectuer une lecture à partir de la base de données, malheureusement, cela ne se produit pas et je finis toujours coincé avec les éléments « inactifs » qui ne veut pas quitter :(

S'il vous plaît aider :)

Merci!

Nermine.

+0

CTP5 est une version obsolète. Vous devriez utiliser EF 4.1RC –

+0

Salut Ladislav, en fait j'utilise 4.1 RC, désolé pour désinformer :( – bignermo

Répondre

0

Le numéro Reload chargera à nouveau uniquement l'entité principale mais pas ses propriétés de navigation. Les propriétés de navigation sont chargées et ne sont pas affectées par le rechargement du parent.

Vous pouvez essayer de le faire (pas sûr si cela aide):

var inactiveUser = GetInactiveUser(region); 
context.Entry(inactiveUser).State = EntityState.Detached; 
+0

C'est cool, mais je ne vois pas ce qu'il fait? Je suis en train de recharger une propriété de navigation, à savoir le 'ICollection Initialement, la propriété de navigation ne filtrerait pas du tout, ce que j'ai dû faire est de dire ceci: this.Configuration.ProxyCreationEnabled = false; 'au constructeur du contexte afin d'éviter de charger le prop de navigation non filtré initialement. GetRegionDetails (int regionID) 'méthode que j'ai pu filtrer, mais seulement la première fois :(Peut-être la propriété' Detached' pourrait jouer un rôle avec le 'ICollection' ?! – bignermo

+0

Je me suis retrouvé avec détachement complet du' ICollection' de la Entité 'Region' et chargement manuel de la collection.C'est une solution de contournement mais je suis toujours à la recherche d'une solution pour recharger les entités associées. – bignermo

Questions connexes