Entity Framework CTP5 Перезагрузка связанных объектов - PullRequest
1 голос
/ 30 марта 2011

Я обдумываю, следует ли отказаться от 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 голосов
/ 30 марта 2011

Нет. Reload снова загрузит только основной объект, но не его свойства навигации. Свойства навигации загружаются и на них не влияет перезагрузка родительского элемента.

Вы можете попытаться сделать это (не уверен, поможет ли это):

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