WCF DataService использует модель данных другой библиотеки классов - невозможно запустить сервис снова - PullRequest
0 голосов
/ 25 января 2012

У меня есть служба данных 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;задавать;}

, который должен быть уникальным и обнуляемым одновременно !!!

поэтому код теперь работает так, как и должно быть, в любом случае, спасибо!

1 Ответ

0 голосов
/ 26 января 2012

Ключевые свойства не должны иметь значение NULL, и они не допускают нулевых значений.Таким образом, рассматриваемый тип не распознается как тип сущности, что обычно приводит к всевозможным проблемам, ошибкам и т. Д.

...