如何对我的clr实体进行非规范化,但保持我的db表规范化?

时间:2012-01-12 11:57:13

标签: c# .net entity-framework ria

我有这两个相关的表Client(ClientId,Name)和ClientDescription(ClientDescriptionId,(FK)ClientId,Description)。也就是说每个客户端可以有许多相关的描述。现在,当显示ClientDescriptions列表时,我还需要知道它的关联客户端的名称是什么。

现在你可能会说我已经拥有了这些信息,因为我可以简单地将我的导航属性关回到相关的客户端并使用其名称。我不能这样做,因为我在Ria服务中自动生成一个网格,这只是给了我一个导航属性的计数,我还没有找到一种方法在我的元数据文件中压缩它。因此我想要一个房产。

整个想法是我希望能够在我的数据库中添加一个新字段,从数据库更新我的实体类并重新生成我的域服务,新字段应该只在我的网格中弹出。我不应该因为我的数据库碰巧有一个额外的字段而更新我的xaml。

所以,我想要做的是将ClientName字段添加到实体(clr对象),但保持我的数据库清洁(在数据库中没有这样的非规范化)。

所以,我生成了我的edmx,并添加了一个名为ClientName的新属性。将其设置为StoreGeneratedPattern.Computed,并进行编译。然后我得到一个讨厌的小错误

Error 3004: Problem in mapping fragments starting at line NN: No mapping specified for properties (etc..)

解决方案显然是从我的edmx生成我的数据库。 (或者这就是关于该错误的问题的答案似乎会产生。)但是这会生成一个我不想要的实际DB字段,因此答案不适用于我的情况。

所以我的问题是:如何对我的clr实体进行非规范化,但保持我的db表规范化?

编辑:我想这个问题可以概括一点。如果ClientDescription包含一些我想要进行计算的数字字段,问题就会一样,我希望结果可用作字段,算法应该在c#而不是在我的数据库中。

1 个答案:

答案 0 :(得分:2)

回答您更广泛的问题:

实体由实体框架使用partial关键字生成。 这意味着实体的代码可以分成同一命名空间和程序集中的多个源文件。一个将包含来自Entity Framework的生成代码,另一个将包含自定义属性和方法。

例如,如果您的实体具有数据库字段PriceAmount,则可以在部分类TotalPrice中添加一个属性,该属性将返回Price * Amount

然后算法将是C#,你的数据库将不知道额外的属性。