У меня есть служба данных wcf, которая использует какой-то объект poco.Чтобы проверить эти объекты при изменении, я хочу использовать System.ComponentModel.DataAnnotations metadata - validation
.
. Для целей тестирования я создал консольное приложение, которое использует этот wcf dataservice.Все работает нормально.Кроме того, также должна быть проверка на стороне клиента.Служебная ссылка не предоставляет атрибут 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; }
}
На эти две "сущности" (POCO), на которые я ссылаюсь (поскольку они расположены в одной и той жерешение) и использование в классе 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>(); }
}
}
Здесь я загружаю данные базы данных в объекты, очень простые для целей тестирования, прежде чем помещать модель данных в работающую библиотеку классов.
Наконец, в веб-сервисе я создаю свой «контекстный» объект, подобный этому.как уже было сказано, прежде чем поместить модель данных в библиотеку классов, это также работало нормально ...
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;
}
}
Я также могу построить решение, но как только я вызываю службу во время выполнения, я 'получаю ошибку вроде: метаг не может быть решен, исключение мыльного контракта aso ...
есть какие-нибудь подсказки?Теперь я мог бы использовать wcf ria и Entity Framework, но я должен полагаться на "пользовательский" обходной путь ...
Спасибо !!!
Я становлюсь ближе, возможно, этоимеет какое-то отношение к типам пустых тюков:
не работает:
[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; }
продолжайте поиск ... потому что необходим обязательный атрибутnull или string.Empty ...
тьфу, иногда я пишу забавные вещи!
[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; }
}
что не имеет особого смысла, если вы укажетеполе ключевых данных, например:
[DataServiceKey (" ORDERUSER_KEY ")]
public int? ORDERUSER_KEY {get;задавать;}
, который должен быть уникальным и обнуляемым одновременно !!!
поэтому код теперь работает так, как и должно быть, в любом случае, спасибо!