【问题标题】:Entity Framework CTP5 Reload related entities实体框架 CTP5 重新加载相关实体
【发布时间】:2011-03-30 14:20:32
【问题描述】:

我正在考虑是否在我刚开始的新应用程序的开发中退出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;
    }

这将使用标记为IsActive = true 的所有RegionUser 实体填充RegionUsers 集合。这意味着那些标记为非活动的我们将无法获取:)

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

我已经读到Entry(Regions).Reload() 应该从数据库中读取,不幸的是这并没有发生,我最终还是被那些不会离开的“非活动”项目卡住:(

请帮忙:)

谢谢!

Nermin.

【问题讨论】:

  • CTP5 版本过时。您应该使用 EF 4.1RC
  • 嗨,Ladislav,实际上我使用的是 4.1 RC,抱歉误导:(

标签: entity-framework entity-framework-ctp5


【解决方案1】:

没有。 Reload 将仅再次加载主实体,而不是其导航属性。导航属性已加载,并且不受重新加载父级的影响。

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

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

【讨论】:

  • 这很酷,但我看不到它的作用?我正在尝试重新加载导航属性,即ICollection。最初,导航属性根本不会过滤。我要做的就是将这个this.Configuration.ProxyCreationEnabled = false; 告诉上下文的构造函数,以避免最初加载未过滤的导航道具。然后在我的GetRegionDetails(int regionID) 方法中我能够过滤,但只是第一次:( 也许Detached 属性可以与ICollection 一起发挥作用?!
  • 我最终将ICollection 与实体Region 完全分离并手动加载集合。这是一种解决方法,但我仍在寻找有关如何重新加载相关实体的解决方案。
猜你喜欢
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多