MVC 4中的Azure Model到TableServiceEntity

时间:2013-12-21 23:54:39

标签: asp.net-mvc asp.net-mvc-4 automapper azure-storage azure-table-storage

我已启动并运行MVC 4站点。目前我一直在使用localDB,我想更改它,以便从Azure Table Storage读取和写入所有内容。

这并不难做到,但它为我提出了一个设计问题:我不想直接在我的模型上实现TableServiceEntity,原因有两个:

  • 我有商业明智的属性,比如ID,我不想让rowkey / partition键字段替换它们(或让它们复制那里的值)
  • 最重要的是:人们不希望模型知道它们写在哪里(应该从模型中隐藏)

所以问题是:这里最好的方法是什么? (使用DTO / automapper / ......?)

亲切的问候,

2 个答案:

答案 0 :(得分:1)

关于您的方案和Azure表的几个注释

  1. 查看客户端的3.0 release,该表对表格有显着的性能改进,包括JSON light / nometadata
  2. 我强烈建议使用提供TableEntity,ITableEntity和DynamicTableEntity类型的Table服务层。
  3. 这里有几个选项,第一个是使用TableEntity对象并通过覆盖ITableEntity.Read/Write实体来自定义序列化。这将允许您在序列化/反序列化期间更改属性名称/值等。

    您也可以使用DTO类型,但是必须单独维护对象等。 在大约40:30的teched演讲中,我演示了如何使用通用的EntityAdapter类来直接保存未从TableEntity派生的第三方对象或实现ITableEntity接口。 (您可以找到示例here的来源。)此方法允许您将任何对象类型保留到Azure表,而不会对存储本身产生任何依赖。

答案 1 :(得分:0)

我已经为我的一个存储库实现了表存储,我得到了它的工作。 还有一件事。

我注意到示例代码中有一条提示放入where子句的注释。 这是我在存储库中使用的方法,它获取了Benificiary记录的集合:

IQueryable<Benificiary> retrievedBenificiaries = (from entry in table.CreateQuery<DynamicTableEntity>() select entry).Resolve(EntityAdapter.AdapterResolver<Benificiary>);

所以这会返回一个IQueryable<Benificiary>,并且在接收它的控制器中,我想要执行以下操作:

    public ActionResult Edit(int id = 0)
    {
        Benificiary benificiary = benificiaryRepository.GetAll().Where(b => b.BenificiaryID == id).First();
        if (benificiary == null)
        {
            return HttpNotFound();
        }

        return View(benificiary);
    }

但Where子句会弹出错误:

{“表达式'System.Linq.IOrderedQueryable 1[Microsoft.WindowsAzure.Storage.Table.DynamicTableEntity]' cannot be used for parameter of type 'System.Linq.IQueryable 1 [HomeConstructionManager.Models.Benificiary]'方法'System.Linq.IQueryable 1[HomeConstructionManager.Models.Benificiary] Where[Benificiary](System.Linq.IQueryable 1 [HomeConstructionManager.Models。 Benificiary],System.Linq.Expressions.Expression 1[System.Func 2 [HomeConstructionManager.Models.Benificiary,System.Boolean]])'“}

我做的唯一一件事就是先做ToList并应用where子句。

Benificiary benificiary = benificiaryRepository.GetAll().ToList<Benificiary>().Where(b => b.BenificiaryID == id).First();

我应该这样做,还是有更好的方法呢?

另外,我注意到当我使用EntityAdapter时,它很好地填充了rowkey和分区键,但属性仍然存在,因此它在存储表中存储了两倍。