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(服务器端)生成的吗,还是您自己创建的自定义元数据文件?非常感谢,非常感谢您所做的努力!我将查看模板的修改:)