Subsonic3和ASP.NET MVC:是否有像DataContext.GetTable <t>?</t>这样的东西

时间:2010-10-28 15:54:10

标签: asp.net-mvc linq-to-sql subsonic subsonic3 datacontext

现在我正在通过SportsStore练习Sanderson的“Pro ASP.Net MVC 2 Framework”一书(第107页),我练习让我实现一个由DB存储支持的存储库模式,使用LINQ-to- SQL。我正试图弄清楚如何使用Subsonic ORM实现这个相同的存储库。

基本存储库代码如下:

using System.Data.Linq;
namespace DomainModel.Concrete
{
    public class SqlProductsRepository : IProductsRepository
    {
        private Table<Product> productsTable;
        public SqlProductsRepository(string connectionString)
        {
            productsTable = 
                    (new DataContext(connectionString)).GetTable<Product>();
        }

        public IQueryable<Product> Products
        {
            get { return productsTable; }
        }
    }
}

我认为代码的LINQ-To-SQL特定部分是涉及DataContext和GetTable的行。

Subsonic是否有类似的机制?如果是的话,

  • 代码会是什么样的?
  • 我可以使用System.Data.Linq表中的可用方法,如:
    • InsertOnSubmit()
    • 附加()
    • DeleteOnSubmit()
    • 的SubmitChanges()

更新 得到你的消息。令人印象深刻的模板,但我决定先尝试更简单的事情:

using SubSonic.Repository;
namespace DomainModel.Concrete
{
    public class SqlProductsRepository : IProductsRepository
    {
        private SimpleRepository repo;
        private IQueryable<Product> products;
        public IQueryable<Product> Products
        {
            get { return products; }
        }

        public DbProductsRepository(string subsonicDatastore)
        {
            repo = new SimpleRepository(subsonicDatastore, SimpleRepositoryOptions.RunMigrations);
            this.Refresh();
        }

        public void SaveProduct(Product product) { SaveProduct(new List<Product>() { product }); }
        public void SaveProduct(IEnumerable<Product> productList)
        {
            var newProducts = from product in productList
                                 where product.ID == 0
                                 select product;
            var oldProducts = from product in productList
                                 where product.ID > 0
                                 select product;
            // If it's a new Product, just add it to the Repo
            repo.AddMany<Product>(newProducts);
            // If it's old, just update it.
            repo.UpdateMany<Product>(oldProducts);
            // Refresh internal list of products, in case table has changed.
            this.Refresh();
        }

        public void DeleteProduct(Product product) { DeleteProduct(new List<Product>() { product }); }
        public void DeleteProduct(IEnumerable<Product> productList)
        {
            repo.DeleteMany<Product>(productList);
            this.Refresh();
        }

        private void Refresh()
        {
            products = repo.All<Product>();
        }
    }
}

据我所知,DataContext没有替代品,但还有其他选择同样容易。

当我有更多时间时,我仍然计划检查你的解决方案。它似乎更复杂,但更灵活/适应性更强。

谢谢!

1 个答案:

答案 0 :(得分:1)

椒盐脆饼 - 我们再次相遇:)

我使用亚音速3但是将它与通用存储库模式一起使用。这意味着我只有一个“工厂”用于抛出实体。看起来有点像这样:

public class SubSonicRepository<T> : IRepository<T> where T : new()
{
    private readonly IQuerySurface _db;

    public SubSonicRepository()
        : this(SubsonicFrameworkObjectContextPerRequest.CurrentDatabase)
    {
    }

    public SubSonicRepository(IQuerySurface db)
    {
        _db = db ?? DB.CreateDB();
    }

    // lots of stuff omitted!!

    private IQueryable<T> GetAll()
    {
        var result = _db.GetQuery<T>();
        return result;
    }

    T IRepository<T>.GetByKey(object key)
    {
        ITable tbl = _db.FindTable(typeof(T).Name);

        var result = _db.Select.From(tbl)
                               .Where(tbl.PrimaryKey.Name).IsEqualTo(key)
                               .ExecuteSingle<T>();
        return result;
    }
}

...随后有很多其他代码。 _repository在每个控制器(或服务层)中实例化,上面提到的场景以稍微不同的方式发生。

现在,如果我可以将T4模板的副本交给您,那么您可以通过消息咆哮而无需我的消息来关注它:)