일부 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 한 번에 있어야합니다!
코드가 이제는 정상적으로 작동하므로 감사합니다.