WCF Dataservices插入多个表

时间:2012-07-24 19:43:41

标签: sql-server database entity-framework wcf-data-services odata

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

表:

tbl_Shop

  • ShopID(主键)
  • 位置
  • 所有者

tbl_Products

  • ProductID(主键)
  • ShopID
  • 产品名称
  • ProductPrice

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

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

我有一个我想要的场景:

  • 步骤1)在tbl_Shop中创建一个新条目
  • 步骤2)创建许多产品并将其与步骤1中创建的商店
  • 相关联

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

我最初想在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();
    }

}

2 个答案:

答案 0 :(得分: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表。

答案 1 :(得分:0)

要使用JavaScript同时插入多个表,您需要构建 深插入 有效负载并将其POST到服务中。如果您使用data.js之类的东西作为OData服务的客户端,这可能会大大简化。

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

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

    {    “_ 元数据”:{       “类型”: “ODataDemo.Product”    },    “ID”:0,    “描述”:“玩的乐趣”,    “DiscontinuedDate”:空,    “名字”:“傻腻子”,    “价格”: “4.25”,    “等级”:5,    “RELEASEDATE”: “/日期(1343765403829)/”,    “类别”:{       “ _metadata”:{          “类型”: “ODataDemo.Category”       },       “ID”:0,       “名称”:“玩具”    } }

  4. 检查201 Created回复

  5. 从“产品和类别”实体集中获取以查看新实体。