2012-01-25 2 views
0

일부 poco 객체를 사용하는 wcf dataservice가 있습니다. 변경이 발생했을 때이 개체의 유효성을 검사하기 위해 System.ComponentModel.DataAnnotations metadata - validation을 사용하고 싶습니다.WCF DataService는 다른 클래스 라이브러리의 데이터 모델을 사용합니다. 서비스를 다시 실행할 수 없습니다.

테스트 목적으로이 wcf dataservice를 사용하는 콘솔 앱을 만들었습니다. 모든 것이 잘 작동합니다. 또한 클라이언트 쪽 유효성 검사도 수행해야합니다. servicereference는 validations 속성을 자동으로 노출하지 않습니다. 그래서 아이디어는 같은 일반적인 .NET 클래스 라이브러리에있는 모든 데이터 모델/구조를 넣어했다 : 내가 참조하고있어

[DataServiceKey("ADRESSEN_KEY")] 
public partial class Adresse 
{ 
    [Required(ErrorMessage = "Das ADRESSEN_KEY-Feld darf nicht leer sein.")] 
    public int? ADRESSEN_KEY { get; set; } 
    public string ADRESSEN_NAM1 { get; set; } 
    public string ADRESSEN_STRA { get; set; } 
    [StringLength(4, ErrorMessage = "Die PLZ darf nur 4-stellig sein.")] 
    public string ADRESSEN_PLZ { get; set; } 
    public string ADRESSEN_ORT { get; set; } 
} [DataServiceKey("ORDERUSER_KEY")] 
public partial class OrderUser 
{ 
    [Required(ErrorMessage = "Das ORDERUSER_KEY-Feld darf nicht leer sein.")] 
    public int? ORDERUSER_KEY { get; set; } 
    public string ORDERUSER_NAME { get; set; } 
    public string ORDERUSER_VORNAME { get; set; } 
    public string ORDERUSER_USER { get; set; } 
    public string ORDERUSER_PWD { get; set; } 
    public int? ORDERUSER_ADRKEY { get; set; } 
} 

이 두 개의 "실체"(포항 강판)을 (그들이 동일한 솔루션에 위치하고 있습니다로) 과 같은 WCF의 DataService의 클래스에서 사용 : 여기

public class AllEntities 
{ 
    private List<OrderUser> _orderUserCollection = null; 
    private List<OrderUser> LoadDataOrderUser() 
    { 
     List<OrderUser> orderUsers = new List<OrderUser>(); 
     i3.Data.DataReader dataReader = null; 
     try 
     { 
      dataReader = new i3.Data.DataReader("SELECT * FROM ORDERUSER", ConfigurationManager.ConnectionStrings["i3Database"].ConnectionString); 
      if (dataReader.HasRows) 
      { 
       do 
       { 
        orderUsers.Add(new OrderUser() { 
         ORDERUSER_KEY = Convert.ToInt32(dataReader["ORDERUSER_KEY"]), 
         ORDERUSER_NAME = dataReader["ORDERUSER_NAME"].ToString(), 
         ORDERUSER_VORNAME = dataReader["ORDERUSER_VORNAME"].ToString(), 
         ORDERUSER_USER = dataReader["ORDERUSER_USER"].ToString(), 
         ORDERUSER_PWD = dataReader["ORDERUSER_PWD"].ToString(), 
         ORDERUSER_ADRKEY = Convert.ToInt32(dataReader["ORDERUSER_ADRKEY"])}); 
       } while (dataReader.Read()); 
      } 
     } 
     catch { } 

     if (dataReader != null) 
     { 
      if (!dataReader.mRS.IsClosed) 
       dataReader.Close(); 
     } 

     return orderUsers; 
    } 

    public IQueryable<OrderUser> OrderUserCollection 
    { 
     get { _orderUserCollection = LoadDataOrderUser(); return _orderUserCollection.AsQueryable<OrderUser>(); } 
    } 


    private List<Adresse> _adresseCollection = null; 
    private List<Adresse> LoadDataAdresse() 
    { 
     List<Adresse> adressen = new List<Adresse>(); 
     i3.Data.DataReader dataReader = null; 
     try 
     { 
      dataReader = new i3.Data.DataReader("SELECT * FROM ADRESSEN", ConfigurationManager.ConnectionStrings["i3Database"].ConnectionString); 
      if (dataReader.HasRows) 
      { 
       do 
       { 
        adressen.Add(new Adresse() 
        { 
         ADRESSEN_KEY = Convert.ToInt32(dataReader["ADRESSEN_KEY"]), 
         ADRESSEN_NAM1 = dataReader["ADRESSEN_NAM1"].ToString(), 
         ADRESSEN_ORT = dataReader["ADRESSEN_ORT"].ToString(), 
         ADRESSEN_PLZ = dataReader["ADRESSEN_PLZ"].ToString(), 
         ADRESSEN_STRA = dataReader["ADRESSEN_STRA"].ToString() 
        }); 
       } while (dataReader.Read()); 
      } 
     } 
     catch { } 

     if (dataReader != null) 
     { 
      if (!dataReader.mRS.IsClosed) 
       dataReader.Close(); 
     } 

     return adressen; 
    } 

    public IQueryable<Adresse> AdresseCollection 
    { 
     get { _adresseCollection = LoadDataAdresse(); return _adresseCollection.AsQueryable<Adresse>(); } 
    } 
} 

내가이 일을 클래스 라이브러리로 데이터 모델을 놓기 전에 테스트 목적을 위해 매우 간단한 객체로 데이터베이스의 데이터를로드하고 있습니다.

마지막으로 웹 서비스에서 나는 내 "컨텍스트"를 instanciating - 이런 식으로. 으로는

public class i3DataService : DataService<AllEntities> 
{ 
    // This method is called only once to initialize service-wide policies. 
    public static void InitializeService(DataServiceConfiguration config) 
    { 
     // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All); 
     config.SetEntitySetAccessRule("*", EntitySetRights.All); // für alle Entities soll CRUD zur Verfügung stehen 
     config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); // alle Operationen sind zulässig 
     config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
    } 
} 

가 나는 또한 솔루션을 구축 할 수있어하지만 난 runntime에서 서비스를 호출하고있어 마자 나는군요 ...이 LSO는 괜찮 았는데 클래스 라이브러리로 데이터 모델을 퍼 팅하기 전에 말했다 같은 오류 : 메타 태그를 해결할 수 없습니다, 비누 계약 예외는 ...

어떤 힌트? 이제 wcf ria 및 엔티티 프레임 워크를 사용할 수 있었지만 "사용자 지정"작업에 의존해야했습니다 ...

감사합니다!

작동하지 :

[Required(ErrorMessage = "Das ADRESSEN_KEY-Feld darf nicht leer sein.")] 
public **int?** ADRESSEN_KEY { get; set; } 

가 작동 : 나는 더 가까워지고있어

는, 아마도 그것은 널 베일 유형 함께 할 수있는 뭔가가

[Required(ErrorMessage = "Das ADRESSEN_KEY-Feld darf nicht leer sein.")] 
public **int** ADRESSEN_KEY { get; set; } 

이 검색 계속을 .. required 속성이 null 또는 string.Empty를 필요로하기 때문에 ...

남자, 가끔은 재미있는 것들을 코딩 해요!

[DataServiceKey ("ORDERUSER_KEY")]

공공 INT :

[MetadataType(typeof(Adresse))] 
[DataServiceKey("ADRESSEN_KEY")] 
public partial class Adresse 
{ 
    public int ADRESSEN_KEY { get; set; } 
    public string ADRESSEN_NAM1 { get; set; } 
    public string ADRESSEN_STRA { get; set; } 
    [StringLength(4, ErrorMessage = "Die PLZ darf nur 4-stellig sein.")] 
    public string ADRESSEN_PLZ { get; set; } 
    public string ADRESSEN_ORT { get; set; } 
    [Required(ErrorMessage = "Das ADRESSEN_TEST-Feld darf nicht leer sein.")] 
    public int? ADRESSEN_TEST { get; set; } 
} 
[MetadataType(typeof(OrderUser))] 
[DataServiceKey("ORDERUSER_KEY")] 
public partial class OrderUser 
{ 
    public int ORDERUSER_KEY { get; set; } 
    public string ORDERUSER_NAME { get; set; } 
    public string ORDERUSER_VORNAME { get; set; } 
    public string ORDERUSER_USER { get; set; } 
    public string ORDERUSER_PWD { get; set; } 
    [Required(ErrorMessage = "Das ORDERUSER_ADRKEY-Feld darf nicht leer sein.")] 
    public int? ORDERUSER_ADRKEY { get; set; } 
} 

많은 의미가 당신이 좋아하는 keydatafield를 지정하면 무엇을하지 않는 이유는 무엇입니까? ORDERUSER_KEY {get; 세트; }

고유하고 nullable 한 번에 있어야합니다!

코드가 이제는 정상적으로 작동하므로 감사합니다.

답변

0

키 속성은 Null을 허용 할 수 없으며 Null 값을 허용하지 않습니다.문제의 유형은 일반적으로 모든 종류의 문제, 오류 등을 초래하는 엔티티 유형으로 인식되지 않습니다.

관련 문제