Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取服务器端字段的字符串长度?_C#_Entity Framework_Wcf Ria Services - Fatal编程技术网

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

C# 如何获取服务器端字段的字符串长度?,c#,entity-framework,wcf-ria-services,C#,Entity Framework,Wcf Ria Services,我有一个从数据库创建的edmx模型和一个metadata.cs 在客户机中,.g.cs包括[StringLength(X)]属性以及来自my metadata的my属性 我正在为平面文件导入进行服务器端验证,该导入独立于这些实体的客户端编辑器 我可以应用范围验证和正则表达式验证,但在服务器上找不到StringLength属性。是否有人知道如何在不手动复制元数据属性上的StringLength属性的情况下执行此操作 编辑: 下面是一些代码: 服务器端文件ProductService.metadat

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

在客户机中,
.g.cs
包括
[StringLength(X)]
属性以及来自my metadata的my属性

我正在为平面文件导入进行服务器端验证,该导入独立于这些实体的客户端编辑器

我可以应用范围验证和正则表达式验证,但在服务器上找不到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; }
}
客户端生成的\u代码\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
  }
}

我对这个问题做了一些调查,在互联网上找不到任何关于这个话题的好信息。所以我在这里要说的只是假设

正如您所看到的,自动生成的客户机代理代码比服务器端代码更具有属性。例如,您的实体具有来自实体模型的nice
[StringLength(8)]
属性。在服务器端,自动生成的
.metadata.cs
文件在实体上没有这些属性我认为这一切都与代码生成模板有关

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

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

我为您的问题找到了两种解决方法:

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)]

这里有一个关于元数据的示例

2.修改T4模板

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

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

下面是一些关于T4代码生成的好文章:



我写这篇文章作为一个答案(不适合作为评论),但请记住这都是假设

请指定客户端和服务器下的含义?您是否有WCF服务、其他类型的服务或某种Web UI客户端?@OleksandrPshenychnyy这是一个“支持Silverlight的WCF服务”在服务器端的ASP网站项目上。客户端是Silverlight,这是自动生成的
.g.cs
文件所在的位置,这是正确的,但我无法从服务器代码访问该文件。很抱歉,我没有在Silverlight中过期。但一般来说,将同一对象用于DB access和com不是一种好的做法通过WCF服务进行通信。事实上,我不明白为什么edmx文件会在客户端生成一些atributes?您的客户端是否可以直接访问DB???这是服务器的责任。不,不是,这只是EF服务的工作方式。客户端属性用于启用客户端验证。我添加了一个示例。它不是Silverlight问题是真的,因为我想在不涉及客户机的情况下执行此操作,所以碰巧客户机自动生成的代码比服务器知道的更多!我在两天前遇到了相同的问题。您的
ProductService.metadata.cs
文件是由EF(服务器端)生成的吗,还是您自己创建的自定义元数据文件?非常感谢,非常感谢您所做的努力!我将查看模板的修改:)