дозвуковые 3 альфа + ado.net услуги передачи данных любые образцы - PullRequest
0 голосов
/ 27 мая 2009

В Интернете есть несколько ресурсов, описывающих предпросмотр 2 дозвукового с Astoria:

http://theruntime.com/blogs/jaykimble/archive/2008/11/18/quotsubsonicquot-for-services-found-subsonic-3--ado.net-data-services.aspx

и рабочий образец на

http://code.msdn.microsoft.com/SubSonicForADONETDS

Я применил все соответствующие изменения к дозвуковым tt, но мне не удалось заставить проект MSDN работать. После устранения:

а) Астория не понравилась private DB () {} в QuerySurface.tt, поэтому я слепо сделал конструктор публичным

b) Не уверен, как генерировать составной первичный ключ

<# if(EnableForUseWIthAstoria) {
#> [System.Data.Services.Common.DataServiceKey("<#=pk#>")] <# }#> 

результат в

[System.Data.Services.Common.DataServiceKey("")] 

вместо

[System.Data.Services.Common.DataServiceKey("OrderID", "ProductID")] 

поэтому просто исключил таблицу.

Текущее препятствие

        var q = from cust in ctx.Customers
                where cust.CustomerID == "ROMEY"
                select cust;

        Customers c = q.First();

приводит к исключению: Ресурс не найден для сегмента «Клиенты»

Кто-нибудь пробовал это или знает другой самый последний и лучший образец существования?

Ответы [ 4 ]

1 голос
/ 29 мая 2009

См. Этот выпуск для демонстрационного шаблона для служб данных:

http://code.google.com/p/subsonicthree/issues/detail?id=53

0 голосов
/ 27 мая 2009

Я не знаю, смогу ли я заархивировать решение и выдать его, так как задействована дозвуковая лицензия. Это не дозвуковой собственно, и около 2 месяцев (устарело). Я просто запустил проект, чтобы проверить, что он все еще работает и работает. Вот шаги, чтобы сделать это:

Используйте класс UpdatableDatabase, указанный выше. Затем извлеките из него БД (укажите это в шаблоне):

публичный частичный класс DB: UpdateableDatabase

UpdatableDatabase.cs должен быть в сочетании с сгенерированными классами, иначе он не будет работать, поскольку он должен использовать GetType () для классов таблицы.

Сервис - это просто сервисный проект с этим классом:

using System.Data.Services;
using Northwind;

namespace NorthwindService
{
    [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults=true)]
    public class Northwind: DataService<DB>
    {
        // This method is called only once to initialize service-wide policies.
        public static void InitializeService(IDataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.All);
            config.UseVerboseErrors = true;
        }
    }
}

Сервисная часть web.config проста:

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  </system.serviceModel>

Затем для тестового проекта добавьте ссылку на службу в службу. Я взял тестовый код из проекта astoria, я думаю, это было давно:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using WcfClientTest.NorthwindService;

namespace WcfClientTest
{
    /// <summary>
    /// Summary description for WcfTest
    /// To run these tests, load this project, and somehow get a server running at the URI. 
    /// This can be done by updating the service reference to start the development server.
    /// </summary>
    [TestClass]
    public class WcfTest
    {
        private string baseURI = "http://127.0.0.1:49649/Northwind.svc";
        private DB ctx;

        /// <summary>
        /// Sets up test.
        /// </summary>
        [TestInitialize]
        public void SetUp()
        {
            ctx = new DB(new Uri(baseURI));
        }

        [TestCleanup]
        public void Cleanup()
        {
        }

        [TestMethod]
        public void Select_Simple_With_Variable()
        {
            int categoryID = 5;
            IQueryable<Product> result = from p in ctx.Products
                                         where p.CategoryID == categoryID
                                         select p;

            List<Product> products = result.ToList();
            Assert.AreEqual(7, products.Count());
        }

        [TestMethod]
        public void TestAddNew()
        {
            // add customer
            var c = new Customer
                        {
                            CustomerID = "XXXXX",
                            ContactTitle = "Prez",
                            Country = "USA",
                            ContactName = "Big Guy",
                            CompanyName = "Big Guy Company"
                        };
            ctx.AddToCustomers(c);
            ctx.SaveChanges();

            IQueryable<Customer> qCustomer = from cust in ctx.Customers
                                             where cust.CustomerID == "XXXXX"
                                             select cust;

            Customer c2 = qCustomer.FirstOrDefault();

            Assert.AreEqual("XXXXX", c2.CustomerID);

            if (c2 != null)
            {
                ctx.DeleteObject(c2);
            }
            ctx.SaveChanges();

            IQueryable<Customer> qCustomer2 = from cust in ctx.Customers
                                              where cust.ContactName == "Big Guy"
                                              select cust;
            // Returns null if the row isn't found.
            Customer c3 = qCustomer2.SingleOrDefault();
            Assert.AreEqual(null, c3);
        }
    }
}

Это все, что у меня есть, это не сложно собрать. Сейчас это решение для поиска проблемы, но я собираюсь использовать его когда-нибудь. Можно было бы полностью обойти дозвуковой эффект и напрямую использовать IQToolkit, и вместе с некоторыми шаблонами T4 у них довольно приятная система.

0 голосов
/ 27 мая 2009

Вот патч для интерфейса IUpdatable и необходимые изменения шаблона. Я на 99% уверен, что это не войдет в окончательный проект, но, по крайней мере, вы можете видеть, как я это сделал.

http://code.google.com/p/subsonicthree/issues/detail?id=52

0 голосов
/ 27 мая 2009

Да, я зарегистрировал версию ss3 с интерфейсом IUpdatable и унаследовал класс поверхности запроса БД от класса UpdatableDatabase. Я также включил стартовый тестовый проект для этого. Приятно то, что вы можете создать класс БД с помощью Uri и начать работать с сервисом. Но он не является частью текущего ядра, он требует нового класса и некоторой перестановки, плюс небольшие изменения шаблона. Я думаю, что это одна из тех областей, где люди будут продолжать изобретать эту вещь, а не опираться на предыдущую работу. Есть несколько изменений, которые я хотел внести в проект, но они этого не делают, например, настройка нескольких баз данных во время выполнения, службы ado.net и т. Д. Я думаю, что мне придется постоянно ветвить свою собственную версию.

Эта проблема имеет вложение, показывающее класс UpdatableDatabase.

Я добавил это к SubSonicClasses.ttinclude:

public string PrimaryKey
{
    get { return Utilities.CleanUp(this.Schema.GetTablePrimaryKey(TableSchema, TableNameRaw)); }
}

...

[System.Data.Services.Common.DataServiceKey("<#=PrimaryKey #>")]

Я вижу, что я изменял с OrderDetails в Northwind и добавил второй ключ, непосредственно редактируя файл. Вы можете легко написать такой метод в DatabaseSchema.ttinclude:

public string[] GetTablePrimaryKeys(string tableSchema, string tableName)

и создайте правильную строку.

...