【问题标题】:WCF DataService use data model of other class library - unable tu run the service againWCF DataService 使用其他类库的数据模型 - 无法再次运行该服务
【发布时间】: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;放; }

应该是唯一的并且可以同时为空!!!

所以代码现在可以正常工作了,谢谢!

【问题讨论】:

    标签: wcf-data-services


    【解决方案1】:

    键属性不能为空,并且它们不允许空值。因此,所讨论的类型不被识别为实体类型,这通常会导致各种问题、错误等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多