我已启动并运行MVC 4站点。目前我一直在使用localDB,我想更改它,以便从Azure Table Storage读取和写入所有内容。
这并不难做到,但它为我提出了一个设计问题:我不想直接在我的模型上实现TableServiceEntity,原因有两个:
所以问题是:这里最好的方法是什么? (使用DTO / automapper / ......?)
亲切的问候,
答案 0 :(得分:1)
关于您的方案和Azure表的几个注释
这里有几个选项,第一个是使用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和分区键,但属性仍然存在,因此它在存储表中存储了两倍。