【发布时间】:2012-01-25 12:33:52
【问题描述】:
我有一个 wcf 数据服务,它正在使用一些 poco 对象。为了在发生更改时验证此对象,我想使用System.ComponentModel.DataAnnotations metadata - validation。
出于测试目的,我创建了一个使用此 wcf 数据服务的控制台应用程序。一切正常。此外,还应该有客户端验证。 servicereference 不会自动公开验证属性。所以想法是将所有数据模型/结构放在一个通用的 .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 数据服务类中使用,例如:
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>(); }
}
}
这里我将数据库的数据加载到对象中,在将数据模型放入它工作的类库之前非常简单的测试目的。
最后,在 web 服务中,我像这样实例化我的“上下文”对象。正如在将数据模型放入类库之前所说的那样,这也很好......
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;
}
}
我也能够构建解决方案,但是一旦我在运行时调用服务,我就会收到如下错误:mettag 无法解析,soap 合同异常...
有什么提示吗? 我现在可以使用 wcf ria 和实体框架,但我必须依赖“自定义”解决方法......
谢谢!!!
我越来越接近了,也许它与 Null-bale 类型有关:
不工作:
[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; }
}
如果您指定 keydatafield,则没有多大意义:
[DataServiceKey("ORDERUSER_KEY")]
public int? ORDERUSER_KEY { get;放; }
应该是唯一的并且可以同时为空!!!
所以代码现在可以正常工作了,谢谢!
【问题讨论】: