实体框架CTP5重新加载相关实体

时间:2011-03-30 14:20:33

标签: entity-framework entity-framework-ctp5

我正在考虑是否在开始我刚刚开始的新应用程序时从EF CTP5中删除。

这是我的情况:

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; }
}

我的目标是过滤掉非活动用户,而不是删除表格中的条目我将已删除的用户标记为非活动状态,即IsActive = false; ...

我实现了这样的过滤:

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;
    }

这会在RegionUsers集合中填充标有RegionUser的所有IsActive = true个实体。这意味着标记为非活动的那些将被我们取走:)

但是,如果我决定使用RegionUser更新任何IsActive = false个实体,则更改会反映在RegionUsers集合中,但问题是该集合仍包含我的项目希望过滤掉。

我已经读过Entry(Regions).Reload()应该从数据库执行读取,遗憾的是,这种情况并没有发生,我仍然最终坚持不会离开的“非活动”项目:(

请帮助:)

谢谢!

Nermin。

1 个答案:

答案 0 :(得分:0)

没有。 Reload将仅重新加载主要实体,但不会再加载其导航属性。加载导航属性,不受重新加载父项的影响。

您可以尝试这样做(不确定这是否有帮助):

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