4

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

在阅读过程中,我发现了一些信息,并一直在做以下事情。IRepository.cs

public interface IRepository<T> where T: TableServiceEntity
{

    T GetById(int Id);

    IQueryable<T> 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 class DeviceMeController : Controller
{

    private IRepository<Entity>_repository;

    public Controller() : this(new Repository<Entity>()) 
    {
    }
    public Controller(IRepository<Entity> repository) 
    {
        _repository = repository;
    }
    public ActionResult Index()
    {
        var List = _repository.GetAll();

        return View(deviceList);
    }

和接口 Reposistory.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;

错误是关于空引用,调试器显示变量结果为空?

最后,我需要知道一些事情。

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

这里有任何提示

4

1 回答 1

5

嗨,

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

 public IQueryable<T> DeviceTable 
 { 
     get { return CreateQuery<T>(Constants.DeviceTableName); } 
 } 

因此,当您基于 IQueryable DeviceTable 创建查询时,表名已经设置好了。

问题是我看不到您的上下文类的需要,特别是因为它只能带来单个实体类型(它是通用的并且基于实体)。我的 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();
    }

}

希望这对您有所帮助。

于 2012-06-21T07:09:59.787 回答