【问题标题】:Data Binding of Computed Properties in Entity Framework实体框架中计算属性的数据绑定
【发布时间】:2010-12-09 13:28:25
【问题描述】:

我正在尝试找到一种有效的方法来在 winforms 中对实体框架模型的计算字段进行数据绑定。我正在使用 Visual Studio 2008 和 .NET 框架 3.5。一个例子是 EntityX,假设我有 columnA 和 columnB,我想要一个名为 sumAB 的计算属性。我一直这样做的方式是使用部分类:

public partial class EntityX 
{
    public int sumAB 
    {
        get 
        {
            return this.columnA + this.columnB;
        }
    }
}

然后我使用 Visual Studio 将 EntityX 添加为数据源,因此我可以使用自动拖放数据绑定。我遇到的问题是计算的属性没有出现在数据源字段下。我正在寻找一种方法来实现计算字段的自动数据绑定。

我知道我可以手动执行此操作,但是当 columnA 或 columnB 发生更改时,我还必须手动编写所有绑定代码以刷新字段。我也无权在 SQL 服务器端计算此字段。

有没有人知道任何方法来完成这个或任何其他类似的劝说方向?

谢谢!

更新

我在另一台机器上使用 Visual Studio 2010 和 .NET 4 对此进行了测试,但我仍然收到相同的行为。有趣的是,我可以手动创建一个文本框并添加一个数据绑定,它可以正常工作,如下所示:

sumABTextBox.DataBindings.Add(
  new System.Windows.Forms.Binding("Text", EntityXBindingSource, "sumAB", true));

如果我将属性放在 .edmx 文件中,它也可以工作,但这是不可取的,因为它会在数据库更新时被擦除。

还有其他想法吗?

更新 2

仍然没有解决方案...我不得不在我的代码中使用替代方案来满足最后期限。如果有人找到答案,我仍然对此非常感兴趣......

【问题讨论】:

  • 我看不出你正在做的事情不起作用的原因。它只是一个属性,所以生成数据源的代码如何感知它是不同的,这超出了我的理解。您能否深入研究解决方案中的数据源 xml 并查看其中是否存在属性绑定?
  • 我看了看。我不熟悉这些文件的结构,但我确实注意到它列出了自动生成的文件,但它没有将我的文件列为 TypeInfo 标记中的 CSV 之一。我尝试添加我的文件,保存,重新编译,但没有运气......

标签: c# .net winforms visual-studio-2008 entity-framework


【解决方案1】:

对我来说听起来很奇怪。因为我在我的项目中使用了相同的方法(实体框架、自我跟踪实体、WCF、Winforms)。

我构建了一个简单的 winforms 应用程序来测试它,“计算”属性只显示在文本框控件的 databindings.Text 属性中。

我创建了一个简单的类:

public partial class Test
{
    public int A { get; set; }
    public int B { get; set; }

    public Test()
    {
    }
}
public partial class Test
{
    public int AB
    {
        get { return A * B; }
    }
}

向表单添加了一个绑定源(数据源指向一个 Test 类型的对象)和三个绑定到绑定源和属性的文本框:A、B 和 AB。在表单的构造函数中,我创建了一个测试实例,填充了 A 和 B 的值,将 bindingsource.DataSource 设置为创建的实例,并认为表单上很时髦;)

这个简单的测试用例与您的情况没有什么不同,除了您使用的实体只是偏离路线的对象。从您的描述中我真的看不出问题...任何进一步的 cmets 可以帮助我进一步帮助您...

【讨论】:

  • EntityX 的部分类是否在同一个程序集中?否则它们将被编译成两个单独的“完整类”......
  • 我刚刚用您的样品进行了测试,效果很好。据我所知,它们在同一个程序集和命名空间中。我使用的实体是从现有数据库自动生成的,所以我不确定这是否会影响任何东西。我从代码中访问这些属性没有问题,但是数据源映射器出于某种原因只是忽略了它们。
  • 您是否从 winForms 应用程序“直接”连接到 EF?或者您是否公开服务 (WCF) 并传输实体?在最后一种情况下,当您不共享包含实体的程序集但通过代理生成“知道”客户端的实体时,可能是您的计算属性没有用 [DataMember] 属性装饰......所以winforms / clientside 不会知道这个属性。
  • 感谢您的持续帮助。 EF 实体直接在 winforms 应用程序中创建,没有 WCF。我尝试添加 [DataMember] 属性以防万一,但仍然没有运气......
  • 你能把资源发给我吗?某种方式……?因为现在我想知道发生了什么……
【解决方案2】:

我昨天基本上只是问了同样的问题(WPF 不是 WinForms)-Show Computed Property in Entity Framework and WPF UI

简而言之,我找不到任何自动支持。我必须在 DataGridView 中为每个计算属性创建列。然后,为了让 DataGridView 知道这些属性已经更新,我必须在 OnChanged 部分方法中调用 OnPropertyChanged("ComputedPropertyName")。

例如

public partial class Test
{
    public int AB
    {
        get { return A * B; }
    }

    public partial void OnAChanged()
    {
        OnPropertyChanged("AB");
    }
    public partial void OnBChanged()
    {
        OnPropertyChanged("AB");
    }
}

如果有一个自动的方式来工作,我也想知道。

【讨论】:

  • 是的...基本上我也是这样做的...它没有成功,因为不会有自动的方式来做到这一点...
  • 很高兴基本上成功了,你接受这个问题的答案吗?
猜你喜欢
  • 1970-01-01
  • 2015-09-20
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多