简体   繁体   English

WCF未实现数据注释

[英]WCF not implementing data annotation

I have an N-Tier solution. 我有一个N层解决方案。 It has four projects as shown below: 它有四个项目,如下所示:

  1. Infrastructure (Model class) 基础结构(模型类)
  2. Repository 资料库
  3. Service (WCF) 服务(WCF)
  4. Web (Presentation) 网络(演示)

The infrastructure takes care of the model classes 基础架构负责模型类

Infrastructure 基础设施

using System.Runtime.Serialization;
namespace Infrastructure
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using DataAnnotationsExtensions;

[Serializable]
[DataContract(IsReference = true)]
public partial class COUNTRIES
{
    public COUNTRIES()
    {
        this.CITIES = new HashSet<CITIES>();
        this.LGA = new HashSet<LGA>();
        this.STATES = new HashSet<STATES>();
    }

    [DataMember]
    public int COUNTRY_ID { get; set; }

    // [DataMember(Name = "Country Code")]
    [DataMember]
    [Required(ErrorMessage = "Country Code is required")]
    [Display(Name = "Country Code")]
    [StringLength(2, ErrorMessage = "The {0} must be at least {1} characters long. Plese check again!", MinimumLength = 2)]
    //[Index(IsUnique = true)]
    [RegularExpression(@"^[a-zA-Z]+$", ErrorMessage = "Use letters only please")]
    public string COUNTRY_CODE { get; set; }

    [DataMember]
    [Required(ErrorMessage = "Country Name is required")]
    [Display(Name = "Country Name")]
    //[Index(IsUnique = true)]
    //[StringLength(50, ErrorMessage = "Too long. Plese check again!")]
    [StringLength(50, ErrorMessage = "The {0} must be at least {1} characters long. Plese check again!", MinimumLength = 2)]
    [RegularExpression(@"^[a-zA-Z]+$", ErrorMessage = "Use letters only please")]
    public string COUNTRY_NAME { get; set; }

    [DataMember]
    [Display(Name = "Action Status")]
    public int ACTION_STATUS { get; set; }

    [DataMember]
    [Display(Name = "Date Created")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
    public Nullable<System.DateTime> CREATED_DATE { get; set; }

    [DataMember]
    [Display(Name = "Created By")]
    public Nullable<int> CREATED_BY { get; set; }

    [DataMember]
    [Display(Name = "Last Update Date")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
    public Nullable<System.DateTime> LAST_UPDATE_DATE { get; set; }

    [DataMember]
    [Display(Name = "Last Update By")]
    public Nullable<int> LAST_UPDATE_BY { get; set; }

    [DataMember]
    [Display(Name = "Date Deleted")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
    public Nullable<System.DateTime> DELETED_DATE { get; set; }

    [DataMember]
    [Display(Name = "Deleted By")]
    public Nullable<int> DELETED_BY { get; set; }


    [DataMember]
    public virtual ICollection<CITIES> CITIES { internal get; set; }

    [DataMember]
    public virtual ICollection<LGA> LGA { internal get; set; }

    [DataMember]
    public virtual ICollection<STATES> STATES { internal get; set; }
}
}

Service: WCF 服务:WCF

namespace BPP.CCSP.Admin.Services.Services.Concrete
{

[ValidateDataAnnotationsBehavior]

public class CountriesService : ICountriesService
{
    //public void DoWork()
    //{
    //}
    private readonly ICountriesManager _countriesManager;

    public CountriesService(ICountriesManager countriesManager)
    {
        _countriesManager = countriesManager;
    }

    public COUNTRIES GetCountry(Int32 countryID)
    {
        return _countriesManager.Country(countryID);
    }

    public IEnumerable<COUNTRIES> GetCountries()
    {
        return _countriesManager.Countries();
    }

    public void AddCountry(COUNTRIES countries)
    {
        _countriesManager.AddCountry(countries);
    }

    public void RemoveCountry(int countryID)
    {
        _countriesManager.Country(countryID);
    }
}
}

The question is, why is the data annotation and validation not being implemented in the presentation layer (view)? 问题是,为什么在表示层(视图)中未实现数据注释和验证?

A key bit of information you have left out is how you imported your service reference into you Presentation project. 您遗漏的关键信息是如何将服务引用导入到Presentation项目中。

I am going to assume for the time being that you used the Service Reference wizard - this is what is causing your issue. 我暂时假设您使用了Service Reference向导-这就是导致您出现问题的原因。 When you use the provided wizard, visual studio looks at the hosted WSDL definition for your WCF service and auto generates new proxy and data contracts in the project you are working in. WSDLs do not support the data annotations you used and therefor are not copied over to the new contracts defined in the presentation project. 使用提供的向导时,Visual Studio会为WCF服务查看托管的WSDL定义,并在您正在处理的项目中自动生成新的代理和数据协定。WSDL不支持您使用的数据注释,因此不会被复制到演示项目中定义的新合同。

To fix this you have two options. 要解决此问题,您有两个选择。

1) Navigate to the auto generated classes in your Presentation project and mark them up. 1)导航到Presentation项目中的自动生成的类并对其进行标记。 Obviously this will lead to duplication of code in the long run and is not the most ideal. 显然,从长远来看,这将导致代码重复,而不是最理想的。

2) Reference your data contracts and service contracts by DLL and write your own proxy class that inherits from ClientBase. 2)通过DLL引用您的数据合同和服务合同,并编写从ClientBase继承的自己的代理类。 You can find more details about that here: Create WCF Client without auto generated proxy . 您可以在此处找到有关此内容的更多详细信息: 创建没有自动生成代理的WCF客户端

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM