【问题标题】:How do I get the string length for a field on the server side?如何获取服务器端字段的字符串长度?
【发布时间】:2012-02-09 18:44:49
【问题描述】:

我有一个从数据库创建的 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
  }
}

【问题讨论】:

  • 请说明客户端和服务器下的含义?您有 WCF 服务、其他类型的服务或某种 Web UI 客户端吗?
  • @OleksandrPshenychnyy 这是服务器端 ASP 网站项目上的“启用 Silverlight 的 WCF 服务”。客户端是 Silverlight,这是自动生成的 .g.cs 文件所在的位置,这是正确的,但我无法从服务器代码访问它。
  • 抱歉,我对 Silverlight 没有经验。但一般来说,通过 WCF 服务使用同一个对象进行 DB 访问和通信并不是一个好习惯。其实我不明白为什么 edmx 文件会在客户端生成一些属性?您的客户是否可以直接访问数据库???这是服务器的责任。
  • 不,它不是,这只是 EF 服务的工作方式。客户端属性用于启用客户端验证。我添加了一个例子。这真的不是 Silverlight 问题,因为我想在完全不涉及客户端的情况下执行此操作,只是碰巧客户端自动生成的代码比服务器知道的更多!
  • 两天前我遇到了同样的问题。您的 ProductService.metadata.cs 文件是由 EF(服务器端)生成的,还是您自己创建的自定义元数据文件?

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


【解决方案1】:

我已经围绕这个问题进行了一些调查,但在 Internet 上找不到有关该主题的任何好的信息。所以我在这里要说的是只是假设

如您所见,自动生成的客户端代理代码比服务器端代码更多地使用属性进行修饰。例如,您的实体具有来自实体模型的漂亮 [StringLength(8)] 属性。在服务器端,自动生成的.metadata.cs 文件在实体上没有这些属性。 我认为这完全是关于代码生成模板

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

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

我看到 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; }
    }
}

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

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

这是关于元数据的nice link

2。修改 T4 模板

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

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

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


我将其写为答案(不适合作为评论),但请记住,这都是假设

【讨论】:

  • 非常感谢,非常感谢您所做的努力!我会看看修改模板:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
相关资源
最近更新 更多