3

使用实体框架代码 首先,我创建了一些对象来将数据存储在我的数据库中。我在这些对象中实现了 ReactiveUI 库中的 ReactiveObject 类,因此每当 prorerty 更改为响应更快的 UI 时,我都会收到通知。

但是实现这一点会为我的对象添加 3 个属性,即 Changed、Changing 和 ThrowExceptions。我真的不认为这是一个问题,但是当在 DataGrid 中加载表时,这些表也会得到一列。

有没有办法隐藏这些属性?我不能只手动定义列,因为我的所有表都有 1 个数据网格,我从组合框中选择它。

在下面和此处找到的解决方案:当 AutoGenerateColumns=True 时,有没有办法隐藏 DataGrid 中的特定列?

    void dataTable_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        List<string> removeColumns = new List<string>()
        {
            "Changing",
            "Changed",
            "ThrownExceptions"
        };

        if (removeColumns.Contains(e.Column.Header.ToString()))
        {
            e.Cancel = true;
        }
    }
4

1 回答 1

6

使用 Code First 有几种方法可以做到这一点。第一种选择是使用以下内容注释属性NotMappedAttribute

[NotMapped]
public bool Changed { get; set; }

现在,这是供您参考的。因为您正在继承一个基类并且无权访问该类的属性,所以您不能使用它。第二种选择是使用Fluent ConfigurationIgnore方法:

modelBuilder.Entity<YourEntity>().Ignore(e => e.Changed);
modelBuilder.Entity<YourEntity>().Ignore(e => e.Changing);
modelBuilder.Entity<YourEntity>().Ignore(e => e.ThrowExceptions);

要访问DbModelBuilder,请覆盖OnModelCreating您的方法DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // .. Your model configuration here
}

另一种选择是创建一个类继承EntityTypeConfiguration<T>

public abstract class ReactiveObjectConfiguration<TEntity> : EntityTypeConfiguration<TEntity>
    where TEntity : ReactiveObject
{

    protected ReactiveObjectConfiguration()
    {
        Ignore(e => e.Changed);
        Ignore(e => e.Changing);
        Ignore(e => e.ThrowExceptions);
    }
}

public class YourEntityConfiguration : ReactiveObjectConfiguration<YourEntity>
{
    public YourEntityConfiguration()
    {
        // Your extra configurations
    }
}

这种方法的优点是您为所有定义一个基线配置ReactiveObject并摆脱所有定义冗余。

上面的链接中有关 Fluent 配置的更多信息。

于 2013-07-15T10:46:51.640 回答