如何获取服务器端字段的字符串长度?

时间:2012-02-07 14:18:02

标签: c# entity-framework wcf-ria-services

我有一个从数据库创建的edmx模型和一个metadata.cs。

在客户端中,.g.cs包含[StringLength(X)]个属性以及我的元数据中的属性。

我正在对平面文件导入进行一些服务器端验证,该导入与这些实体的客户端编辑分开。

我能够应用我的范围和正则表达式验证,但我无法在服务器上找到StringLength属性。有没有人知道如何做到这一点,而无需在元数据属性上手动复制StringLength属性。

修改

以下是一些代码:

服务器端文件ProductService.metadata.cs:

internal sealed class PRODUCTMetadata
{
  [Required]
  [RegularExpression("[A-Z]+")]
  [Display(Name = "Product Code", Order = 10)]
  public string Product_code { get; set; }
}

客户端Generated_Code \ NameSpace.Web.g.cs:

public sealed class PRODUCT
{
  [DataMember()]
  [Display(Name="Product Code", Order=10)]
  [RegularExpression("[A-Z]+")]
  [Required()]
  [StringLength(8)] //This is what I want to know, but server side
  public string Product_code
  {...etc
  }
}

1 个答案:

答案 0 :(得分:2)

我对此问题进行了一些调查,但在互联网上找不到有关该主题的任何有用信息。那么'我在这里说只是假设

如您所见,自动生成的客户端代理代码使用属性而不是服务器端代码。例如,您的实体具有来自实体模型的良好[StringLength(8)]属性。在服务器端,自动生成的.metadata.cs文件在实体上没有这些属性。 我认为这完全取决于代码生成模板

我怀疑RIA Services的代码生成模板(创建.g.cs文件)比在服务器端创建.metadata.cs文件的模板更完整。

您的案例中缺少的属性是客户端用于UI验证的时间的95%这一事实可能解释了为什么.metadata.cs文件的模板不会产生那些验证< / em> attributes。

我看到了2个解决问题的方法:

<强> 1。在服务器端编写自己的元数据类

一些例子:

[MetadataTypeAttribute(typeof(PRODUCT.PRODUCTMetadata))]
public partial class PRODUCT
{
    internal sealed class PRODUCTMetadata
    {
        // Metadata classes are not meant to be instantiated.
        private PRODUCTMetadata()
        {
        }

        [StringLength(8)]
        public string Product_code { get; set; }
    }
}

您可以手动将任何属性添加到实体的属性中,因为实体是部分类。

不幸的是,每次修改模型时都必须维护这些元数据:如果(例如),您的数据库表列从varchar(8)更改为varchar(10),您将能够从您的数据库自动更新您的EDMX模型,但您必须手动检查您的元数据是否仍然正常(在此示例中,您必须手动将[StringLength(8)]替换为[StringLength(9)])。

这是关于元数据的nice link

<强> 2。修改T4模板

第二个选项可能是最好的选项,但我没有经历过代码生成模板修改,所以我不知道可以有效地做什么。

代码生成模板称为T4模板(Text Template Transformation Toolkit)。可以修改这些模板以在代码生成过程中包含您想要的任何内容。您可以修改默认EF模板,以便像RIA Services模板一样生成缺少的属性。

这里有一些关于T4代码生成的好文章:


我写这个作为答案(它不适合作为评论),但记住它是所有假设