Asp.net mvc 3 存储库模式和Azure表存储(?)

Asp.net mvc 3 存储库模式和Azure表存储(?),asp.net-mvc-3,azure-storage,azure-table-storage,Asp.net Mvc 3,Azure Storage,Azure Table Storage,在执行以下简单示例时,我发现了以下困难 正如标题所说,我打算在Azure表存储中存储数据时使用Repository模式。现在我有两个类,Repository.cs、IRepository.cs、DataContext.cs和控制器 在我的阅读过程中,我发现了一些信息,并做了如下工作。 IRepository.cs public interface IRepository<T> where T: TableServiceEntity { T GetById(int Id);

在执行以下简单示例时,我发现了以下困难 正如标题所说,我打算在Azure表存储中存储数据时使用Repository模式。现在我有两个类,Repository.cs、IRepository.cs、DataContext.cs和控制器

在我的阅读过程中,我发现了一些信息,并做了如下工作。 IRepository.cs

public interface IRepository<T> where T: TableServiceEntity
{

    T GetById(int Id);

    IQueryable<T> GetAll();

}
公共接口i位置,其中T:TableServiceEntity
{
T GetById(int-Id);
IQueryable GetAll();
}
以及DataContext.cs

public class DataContext<T>:TableServiceContext where T:TableServiceEntity
{


   public DataContext(CloudStorageAccount storageaccount, StorageCredentials credentials)
        : base(storageaccount.TableEndpoint.AbsoluteUri, credentials) 
    {
       // _storageAccount = storageaccount;

       var  storageAccount =        CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue(KEY_STORAGE));
        storageAccount.CreateCloudTableClient().CreateTableIfNotExist(tableName);


    }

   public IQueryable<T> DeviceTable
   {
       get { return CreateQuery<T>(tableName); }
   }


}
public类DataContext:TableServiceContext其中T:TableServiceEntity
{
公共数据上下文(CloudStorageAccount storageaccount、StorageCredentials凭据)
:base(storageaccount.TableEndpoint.AbsoluteUri,凭据)
{
//_storageAccount=storageAccount;
var storageAccount=CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue(KEY_STORAGE));
storageAccount.CreateCloudTableClient().CreateTableIfNotExist(tableName);
}
公共可交换设备
{
获取{return CreateQuery(tableName);}
}
}
加上控制器的某些部分(我之前创建的表中已有数据)

公共类设备控制器:控制器
{
私人IRepository_存储库;
公共控制器():此(新存储库())
{
}
公共控制器(IRepository存储库)
{
_存储库=存储库;
}
公共行动结果索引()
{
var List=_repository.GetAll();
返回视图(deviceList);
}
在接口repository.cs的实现中,我遇到了一个错误,在某个地方迷路了

 public class Repository<T>:IRepository<T> where T:TableServiceEntity
   {
  private  DataContext<T> _serviceContext;
    // here get tablename as pararameter;
    // so the Enities call this function 
    public Repository()
    {

        // the same context for multiple tables ? 
    }
    // perhaps it should take the table Name
    public void Add(T item)
    {

        _serviceContext.AddObject(TableName,item);
        _serviceContext.SaveChangesWithRetries();
    }
  public IQueryable<T> GetAll()
    {
       var results = from c in _serviceContext.Table
                      select c;

        return results;
公共类存储库:IRepository其中T:TableServiceEntity
{
私有数据上下文serviceContext;
//这里得到表名作为参数;
//所以Enities调用这个函数
公共存储库()
{
//多个表的相同上下文?
}
//也许它应该使用表名
公共作废新增(T项)
{
_AddObject(表名,项);
_serviceContext.SaveChangesWithRetries();
}
公共IQueryable GetAll()
{
var results=来自_servicecoxt.Table中的c
选择c;
返回结果;
错误是关于空引用,调试器显示变量结果为空

最后,我需要知道的事情很少

我应该在Repository.cs构造函数中做什么?我相信Datacontext.cs类必须在一个单独的类中

这里有什么提示吗

首先,我假设您遗漏了一些代码,因为我不知道如何在存储库中获取上下文。但是,假设您设置正确,(注入?)考虑到您设计datacontext的方式,存储库不需要知道表名,因为它是在以下代码行中设置的:

 public IQueryable<T> DeviceTable 
 { 
     get { return CreateQuery<T>(Constants.DeviceTableName); } 
 } 
public IQueryable DeviceTable
{ 
获取{return CreateQuery(Constants.DeviceTableName);}
} 
因此,当您基于IQueryable DeviceTable创建查询时,表名已经设置好

问题是,我不认为需要上下文类,特别是因为它只能带来一个实体类型(它是泛型的,并且基于实体)。 Azure表存储的my Repository的基本布局为:

public abstract class CloudRepository<TEntity> : ICloudRepository<TEntity>
{
    private TableServiceContext _tableServiceContext;
    private string _tableName;

    public string TableName
    {
        get { return _tableName ?? ( _tableName = typeof(TEntity).Name.Replace("Entity", string.Empty).ToLower()); }
    }

    public CloudStorageAccount StorageAccount
    {
        get
        {
            return CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));
        }
    }

    public CloudTableClient TableClient
    {
        get
        {
            CloudTableClient cloudTableClient = StorageAccount.CreateCloudTableClient();
            cloudTableClient.CreateTableIfNotExist(TableName);
            return cloudTableClient;
        }
    }

    public TableServiceContext ServiceContext
    {
        get
        {
            return _tableServiceContext ?? (_tableServiceContext = TableClient.GetDataServiceContext());
        }
    }

    public IEnumerable<TEntity> FindAll()
    {
        return ServiceContext.CreateQuery<TEntity>(TableName).ToList();
    }

}
公共抽象类CloudRepository:ICloudRepository
{
私有表服务上下文\u表服务上下文;
私有字符串_tableName;
公共字符串表名
{
获取{return _tableName???(_tableName=typeof(tenty).Name.Replace(“Entity”,string.Empty).ToLower());}
}
公共云存储帐户存储帐户
{
得到
{
返回CloudStorageAccount.Parse(roleenEnvironment.GetConfigurationSettingValue(“StorageConnectionString”);
}
}
公共CloudTableClient TableClient
{
得到
{
CloudTableClient CloudTableClient=StorageAccount.CreateCloudTableClient();
CreateTableIfNotExist(TableName);
返回客户;
}
}
公共表服务上下文服务上下文
{
得到
{
返回_tableServiceContext??(_tableServiceContext=TableClient.GetDataServiceContext());
}
}
公共IEnumerable FindAll()
{
返回ServiceContext.CreateQuery(TableName.ToList();
}
}

希望这对您有所帮助。

是的,它有帮助。非常感谢!您好,我在所有示例中都看到,为了让ckloudTable客户端对象CreateTable if exist方法正在执行,尽管它不是强制性的,但这项任务是否会很昂贵?因为我们为表的操作向azure付费?或者这不是一个真正的问题?
public abstract class CloudRepository<TEntity> : ICloudRepository<TEntity>
{
    private TableServiceContext _tableServiceContext;
    private string _tableName;

    public string TableName
    {
        get { return _tableName ?? ( _tableName = typeof(TEntity).Name.Replace("Entity", string.Empty).ToLower()); }
    }

    public CloudStorageAccount StorageAccount
    {
        get
        {
            return CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));
        }
    }

    public CloudTableClient TableClient
    {
        get
        {
            CloudTableClient cloudTableClient = StorageAccount.CreateCloudTableClient();
            cloudTableClient.CreateTableIfNotExist(TableName);
            return cloudTableClient;
        }
    }

    public TableServiceContext ServiceContext
    {
        get
        {
            return _tableServiceContext ?? (_tableServiceContext = TableClient.GetDataServiceContext());
        }
    }

    public IEnumerable<TEntity> FindAll()
    {
        return ServiceContext.CreateQuery<TEntity>(TableName).ToList();
    }

}