0

所以我已经启动并运行了我的 WCF 数据服务,但我希望能够插入到多个表中 - 用一个简单的例子来解释会更容易:

表:

tbl_Shop

  • ShopID(主键)
  • 地点
  • 所有者

tbl_产品

  • ProductID(主键)
  • 店铺编号
  • 产品名称
  • 产品价格

1 商店有许多产品。1 个产品只能与 1 个商店关联。

我计划使用存储过程来加入并返回 Shop_ID 上的 tbl_Products 和 tbl_Shop

我有一个我想要的场景:

  • 步骤 1) 在 tbl_Shop 中创建一个新条目
  • 步骤 2) 创建多个产品并将它们与步骤 1 中创建的 Shop 关联

获得此设置的最佳方法是什么?

我最初想在 tbl_Shop 中创建一个条目,返回这个新创建的项目的 ShopID 并在 tbl_Products 中创建时将其插入 - 这似乎是一种混乱/不正确/不可靠的方式。

我还没有在表之间建立关系(不确定是否需要它们?)

谢谢

编辑:

我首先创建了数据库,然后从中生成了一个模型。在 Model1.Designer.cs 我有:

public partial class MyDBEntities3 : ObjectContext
{
   ....

在 Service.svc 我有:

[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class Service : DataService< MyDBEntities3>
{

    public static void InitializeService(DataServiceConfiguration config)
    {

        config.SetEntitySetAccessRule("*", EntitySetRights.All);
        config.SetEntitySetPageSize("*", 50);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;

        config.SetServiceOperationAccessRule("*", ServiceOperationRights.AllRead); 
        //set to false in production
        config.UseVerboseErrors = true;
    }



    [WebGet]
    public IQueryable<GetRentByDate_Result> GetStoretByID(int ID)
    {
        // Calls a Stored Procedure which returns the store of a given StoreID
         return CurrentDataSource.GetRentByDate(ID).AsQueryable();
    }

}

4

2 回答 2

0

在这种情况下,外键关系听起来很适合您。你没有说你正在使用什么风格的 SQL,但这样的事情应该可以解决问题:

ALTER TABLE tbl_Products
ADD CONSTRAINT [MY_FK] FOREIGN KEY([ShopID]) REFERENCES [dbo].[tbl_Shop]([ShopID])

整个关系点,以防止可靠性等问题。


编辑:找出你的新商店的ID......

最简单的方法是创建您的商店表,其中包含IDENTITY沿行的某列

CREATE TABLE tbl_Shop
(
    ShopID INT IDENTITY(1,1) PRIMARY KEY
    Location VARCHAR(100)
    Owner VARCHAR(100)

)

现在,当您在 tbl_Shop 中插入一行时,您必须执行以下操作:

INSERT INTO tbl_Shop (Location, Owner) SELECT 'Mars', 'Martian'

并找出 ShopID

DECLARE @SHOP INT = SCOPE_IDENTITY (assuming SQLServer 2008)

然后您可以使用该变量插入到您的 Product 表中。

于 2012-07-24T19:59:46.927 回答
0

要使用 JavaScript 同时插入多个表,您需要构造一个深度插入有效负载并将其发布到服务。如果您使用data.js 之类的东西作为 OData 服务的客户端,这可能会容易得多。

也就是说,您可以尝试以下一些步骤来演示如何在 JavaScript 中执行此操作:

  1. 使用 Fiddler,对http://services.odata.org/(S(readwrite))/OData/OData.svc/Products执行 GET 。
  2. 将您的会话密钥从响应中复制到该 GET 并在以后的所有 URL 中使用它。
  3. 将以下负载发布到 http://services.odata.org/(S([sessionkeythatyoucopied]))OData/OData.svc/Products(您还应该将 Content-Type 和 Accept 标头设置为 application/json):

    { "_ metadata":{ "type":"ODataDemo.Product" }, "ID":0, "Description":"玩的开心", "DiscontinuedDate":null, "Name":"Silly Putty", “价格”:“4.25”,“评级”:5,“发布日期”:“/日期(1343765403829)/”,“类别”:{“ _metadata”:{“类型”:“ODataDemo.Category”},“ID ":0, "名称":"玩具" } }

  4. 检查 201 Created 响应

  5. 从 Products 和 Categories 实体集中获取以查看新实体。

于 2012-08-01T00:19:50.027 回答