WCF没有实现数据注释

时间:2017-09-22 08:53:25

标签: c# asp.net-mvc wcf

我有一个N层解决方案。它有四个项目,如下所示:

  1. 基础设施(模型类)
  2. 存储库
  3. 服务(WCF)
  4. 网络(演示)
  5. 基础设施负责模型类

    基础设施

    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; }
    }
    }
    

    服务: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);
        }
    }
    }
    

    问题是,为什么数据注释和验证没有在表示层(视图)中实现?

1 个答案:

答案 0 :(得分:0)

您遗漏的一小部分信息是您如何将服务引用导入演示文稿项目。

我将暂时假设您使用了服务引用向导 - 这就是导致您出现问题的原因。当您使用提供的向导时,visual studio会查看WCF服务的托管WSDL定义,并在您正在使用的项目中自动生成新的代理和数据协定.WSDL不支持您使用的数据注释,因此不会复制到演示项目中定义的新合同。

要解决此问题,您有两种选择。

1)导航到Presentation项目中自动生成的类并标记它们。显然,从长远来看,这将导致代码重复,并不是最理想的。

2)通过DLL引用您的数据协定和服务合同,并编写自己的继承自ClientBase的代理类。您可以在此处找到有关详细信息:Create WCF Client without auto generated proxy