using System; using System.Linq; using System.Configuration; namespace Website.DataAccess { public class SqlContentProvider : IContentProvider { private readonly WebsiteDataContext _context; private static bool _ShouldRecreateDatabase = Parse.AppSetting("SqlContentProvider.RecreateDB"); public static bool ShouldRecreateDatabase { get { return _ShouldRecreateDatabase; } set { _ShouldRecreateDatabase = value; } } protected IQueryable ContentTable { get { return _context.Contents; } } #region Constructors public SqlContentProvider(string connectionName) { var connString = ConfigurationManager.ConnectionStrings[connectionName]; _context = new WebsiteDataContext(connString.ConnectionString); EnsureDatabase(); } public SqlContentProvider(WebsiteDataContext context) { _context = context; EnsureDatabase(); } #endregion protected void EnsureDatabase() { if (_context.DatabaseExists() && ShouldRecreateDatabase) { _context.DeleteDatabase(); ShouldRecreateDatabase = false; } if (!_context.DatabaseExists()) _context.CreateDatabase(); } public IContent GetById(int id) { var content = ContentTable.FirstOrDefault(c => c.ID == id); return content; } public IContent GetByName(string url) { if (string.IsNullOrEmpty(url)) return null; var lowerUrl = url.ToLowerInvariant(); var content = ContentTable.FirstOrDefault(c => c.PageName.ToLower() == lowerUrl); return content; } public void Save(IContent content) { if (content == null) throw new ArgumentNullException("content"); if(string.IsNullOrEmpty(content.PageName)) throw new ArgumentNullException("content.PageName"); if (content.ID == default(int)) Insert(content); else Update(content); } protected void Update(IContent content) { if (!(content is Content)) throw new NotImplementedException(); _context.SubmitChanges(); } protected void Insert(IContent content) { if (content == null) throw new ArgumentNullException("content"); var dbContent = Content.FromIContent(content); _context.Contents.InsertOnSubmit(dbContent); _context.SubmitChanges(); content.ID = dbContent.ID; } } }