PageRenderTime 22ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/Plugins/GizmoBeach.Components/DataObjects/EntityFrameworkDbContextRepositoryOrmFrameworkBase.cs

http://github.com/kahanu/CondorXE
C# | 720 lines | 634 code | 76 blank | 10 comment | 6 complexity | 683438edc6f61698504c015d59ae8dad MD5 | raw file
  1. using System;
  2. using Condor.Core;
  3. using Condor.Core.Interfaces;
  4. using MyMeta;
  5. namespace GizmoBeach.Components.DataObjects
  6. {
  7. public class EntityFrameworkDbContextRepositoryOrmFrameworkBase : RenderBase, IORMFramework
  8. {
  9. private readonly EFCriteria _criteria;
  10. protected IDataStore _dataStore;
  11. protected RequestContext _context;
  12. protected IDatabase _database;
  13. protected ProgressDialogWrapper _dialog;
  14. public EntityFrameworkDbContextRepositoryOrmFrameworkBase(IDataStore dataStore, RequestContext context, EFCriteria criteria)
  15. :base(context.Zeus.Output)
  16. {
  17. this._criteria = criteria;
  18. this._dataStore = dataStore;
  19. this._context = context;
  20. this._database = context.Database;
  21. this._dialog = context.Dialog;
  22. }
  23. public EntityFrameworkDbContextRepositoryOrmFrameworkBase(IDataStore dataStore, RequestContext context)
  24. :this(dataStore, context, new EFCriteria())
  25. {
  26. }
  27. #region IORMFramework Members
  28. public string Name
  29. {
  30. get { return "Entity Framework DbContext"; }
  31. }
  32. public void Generate()
  33. {
  34. _dialog.InitDialog(7);
  35. _dialog.Display("Processing EF DbContext Classes");
  36. _context.FileList.Add("");
  37. _context.FileList.Add("Generated EF DbContext Classes:");
  38. _dialog.Display("Processing EF DbContext DataContext Class");
  39. RenderDataContextClass();
  40. _dialog.Display("Processing EF DbContext DataObjectFactory Class");
  41. RenderDataObjectFactory();
  42. _dialog.Display("Processing EF DbContext Disposable Class");
  43. RenderDisposableClass();
  44. _dialog.Display("Processing EF DbContext RepositoryBase Class");
  45. RenderRepositoryBaseClass();
  46. _dialog.Display("Processing EF DbContext IUnitOfWork Interface");
  47. RenderUnitOfWorkInterface();
  48. _dialog.Display("Processing EF DbContext UnitOfWork Class");
  49. RenderUnitOfWorkClass();
  50. _dialog.InitDialog(3);
  51. _dialog.Display("Processing EF DbContext Generated Classes");
  52. _context.FileList.Add("");
  53. _context.FileList.Add("Processing EF DbContext Generated Classes:");
  54. _dialog.Display("Processing EF DbContext DataObjectsBase Class");
  55. RenderDataObjectsBaseClass();
  56. _dialog.Display("Processing EF DbContext IRepository Interface");
  57. RenderIRepositoryInterface();
  58. _dialog.InitDialog();
  59. foreach (string tableName in _script.Tables)
  60. {
  61. ITable table = _database.Tables[tableName];
  62. _dialog.Display("Processing EF DbContext Repository Interface for '" + tableName + "'");
  63. RenderConcreteInterface(table);
  64. }
  65. _dialog.InitDialog();
  66. foreach (string tableName in _script.Tables)
  67. {
  68. ITable table = _database.Tables[tableName];
  69. _dialog.Display("Processing EF DbContext Repository Class for '" + tableName + "'");
  70. RenderConcreteRepositoryClass(table);
  71. }
  72. }
  73. #endregion
  74. #region Private Methods
  75. private void RenderDataObjectsBaseClass()
  76. {
  77. _hdrUtil.WriteClassHeader(_output);
  78. _output.autoTabLn("using System;");
  79. _output.autoTabLn("using System.Data.Entity;");
  80. _output.autoTabLn("using System.Linq;");
  81. _output.autoTabLn("using " + _script.Settings.BusinessObjects.BusinessObjectsNamespace + ";");
  82. _output.autoTabLn("");
  83. _output.autoTabLn("namespace " + _script.Settings.DataOptions.DataObjectsNamespace + ".Generated");
  84. _output.autoTabLn("{");
  85. _output.tabLevel++;
  86. _output.autoTabLn("public class DataObjectsBase : DbContext");
  87. _output.autoTabLn("{");
  88. _output.tabLevel++;
  89. _output.autoTabLn("#region Private Variables");
  90. _output.autoTabLn("");
  91. foreach (string tableName in _script.Tables)
  92. {
  93. _output.autoTabLn("private IDbSet<" + StringFormatter.CleanUpClassName(tableName) + "> _" + StringFormatter.CamelCasing(StringFormatter.CleanUpClassName(tableName, true)) + ";");
  94. }
  95. _output.autoTabLn("");
  96. _output.autoTabLn("#endregion");
  97. _output.autoTabLn("");
  98. _output.autoTabLn("#region ctors");
  99. _output.autoTabLn("");
  100. _output.autoTabLn("public DataObjectsBase(string connectionString)");
  101. _output.tabLevel++;
  102. _output.autoTabLn(": base(connectionString)");
  103. _output.tabLevel--;
  104. _output.autoTabLn("{");
  105. _output.autoTabLn("");
  106. _output.autoTabLn("}");
  107. _output.autoTabLn("");
  108. _output.autoTabLn("#endregion");
  109. _output.autoTabLn("");
  110. _output.autoTabLn("#region Public Properties");
  111. foreach (string tableName in _script.Tables)
  112. {
  113. _output.autoTabLn("public IDbSet<" + StringFormatter.CleanUpClassName(tableName) + "> " + StringFormatter.CleanUpClassName(tableName, true) + "");
  114. _output.autoTabLn("{");
  115. _output.tabLevel++;
  116. _output.autoTabLn("get");
  117. _output.autoTabLn("{");
  118. _output.tabLevel++;
  119. _output.autoTabLn("return _" + StringFormatter.CamelCasing(StringFormatter.CleanUpClassName(tableName, true)) + " ?? (_" + StringFormatter.CamelCasing(StringFormatter.CleanUpClassName(tableName, true)) + " = Set<" + StringFormatter.CleanUpClassName(tableName) + ">());");
  120. _output.tabLevel--;
  121. _output.autoTabLn("}");
  122. _output.tabLevel--;
  123. _output.autoTabLn("}");
  124. _output.autoTabLn("");
  125. }
  126. _output.autoTabLn("#endregion");
  127. _output.autoTabLn("");
  128. _output.tabLevel--;
  129. _output.autoTabLn("}");
  130. _output.tabLevel--;
  131. _output.autoTabLn("}");
  132. _context.FileList.Add(" DataObjectsBase.cs");
  133. SaveOutput(CreateFullPath(_script.Settings.DataOptions.DataObjectsNamespace + "\\Generated", "DataObjectsBase.cs"), SaveActions.Overwrite);
  134. }
  135. private void RenderIRepositoryInterface()
  136. {
  137. _hdrUtil.WriteClassHeader(_output);
  138. _output.autoTabLn("using System;");
  139. _output.autoTabLn("using System.Collections.Generic;");
  140. _output.autoTabLn("using System.Linq;");
  141. _output.autoTabLn("using System.Linq.Expressions;");
  142. _output.autoTabLn("");
  143. _output.autoTabLn("namespace " + _script.Settings.DataOptions.DataObjectsNamespace + ".Generated");
  144. _output.autoTabLn("{");
  145. _output.tabLevel++;
  146. _output.autoTabLn("public interface IRepository<TEntity>");
  147. _output.autoTabLn("{");
  148. _output.tabLevel++;
  149. _output.autoTabLn("IQueryable<TEntity> GetAll();");
  150. _output.autoTabLn("");
  151. _output.autoTabLn("IEnumerable<TEntity> Get(");
  152. _output.tabLevel++;
  153. _output.autoTabLn("Expression<Func<TEntity, bool>> filter = null,");
  154. _output.autoTabLn("Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,");
  155. _output.autoTabLn("string includeProperties = \"\");");
  156. _output.autoTabLn("");
  157. _output.tabLevel--;
  158. _output.autoTabLn("TEntity GetById(object id);");
  159. _output.autoTabLn("");
  160. _output.autoTabLn("void Insert(TEntity entity);");
  161. _output.autoTabLn("");
  162. _output.autoTabLn("void Delete(object id);");
  163. _output.autoTabLn("");
  164. _output.autoTabLn("void Delete(TEntity entityToDelete);");
  165. _output.autoTabLn("");
  166. _output.autoTabLn("void Update(TEntity entityToUpdate);");
  167. _output.tabLevel--;
  168. _output.autoTabLn("}");
  169. _output.tabLevel--;
  170. _output.autoTabLn("}");
  171. _context.FileList.Add(" IRepository.cs");
  172. SaveOutput(CreateFullPath(_script.Settings.DataOptions.DataObjectsNamespace + "\\Generated", "IRepository.cs"), SaveActions.Overwrite);
  173. }
  174. private void RenderConcreteInterface(ITable table)
  175. {
  176. _hdrUtil.WriteClassHeader(_output);
  177. _output.autoTabLn("using System;");
  178. _output.autoTabLn("using System.Linq;");
  179. _output.autoTabLn("using " + _script.Settings.BusinessObjects.BusinessObjectsNamespace + ";");
  180. _output.autoTabLn("using " + _script.Settings.DataOptions.DataObjectsNamespace + ".Generated;");
  181. _output.autoTabLn("");
  182. _output.autoTabLn("namespace " + _script.Settings.DataOptions.DataObjectsNamespace + ".Interfaces");
  183. _output.autoTabLn("{");
  184. _output.tabLevel++;
  185. _output.autoTabLn("public interface I" + StringFormatter.CleanUpClassName(table.Name) + _script.Settings.DataOptions.ClassSuffix.Name + " : IRepository<" + StringFormatter.CleanUpClassName(table.Name) + ">");
  186. _output.autoTabLn("{");
  187. _output.autoTabLn("}");
  188. _output.tabLevel--;
  189. _output.autoTabLn("}");
  190. _context.FileList.Add(" I" + StringFormatter.CleanUpClassName(table.Name) + _script.Settings.DataOptions.ClassSuffix.Name + ".cs");
  191. SaveOutput(CreateFullPath(_script.Settings.DataOptions.DataObjectsNamespace + "\\Interfaces", "I" + StringFormatter.CleanUpClassName(table.Name) + _script.Settings.DataOptions.ClassSuffix.Name + ".cs"), SaveActions.DontOverwrite);
  192. }
  193. private void RenderConcreteRepositoryClass(ITable table)
  194. {
  195. _hdrUtil.WriteClassHeader(_output);
  196. _output.autoTabLn("using System;");
  197. _output.autoTabLn("using System.Linq;");
  198. _output.autoTabLn("using " + _script.Settings.BusinessObjects.BusinessObjectsNamespace + ";");
  199. _output.autoTabLn("using " + _script.Settings.DataOptions.DataObjectsNamespace + ".Interfaces;");
  200. _output.autoTabLn("");
  201. _output.autoTabLn("namespace " + _script.Settings.DataOptions.DataObjectsNamespace + ".Repositories");
  202. _output.autoTabLn("{");
  203. _output.tabLevel++;
  204. _output.autoTabLn("public class " + StringFormatter.CleanUpClassName(table.Name) + _script.Settings.DataOptions.ClassSuffix.Name + " : RepositoryBase<" + StringFormatter.CleanUpClassName(table.Name) + ">, I" + StringFormatter.CleanUpClassName(table.Name) + _script.Settings.DataOptions.ClassSuffix.Name);
  205. _output.autoTabLn("{");
  206. _output.tabLevel++;
  207. _output.autoTabLn("public " + StringFormatter.CleanUpClassName(table.Name) + _script.Settings.DataOptions.ClassSuffix.Name + "(IUnitOfWork unitOfWork):base(unitOfWork)");
  208. _output.autoTabLn("{");
  209. _output.autoTabLn("");
  210. _output.autoTabLn("}");
  211. _output.tabLevel--;
  212. _output.autoTabLn("}");
  213. _output.tabLevel--;
  214. _output.autoTabLn("}");
  215. _context.FileList.Add(" " + StringFormatter.CleanUpClassName(table.Name) + _script.Settings.DataOptions.ClassSuffix.Name + ".cs");
  216. SaveOutput(CreateFullPath(_script.Settings.DataOptions.DataObjectsNamespace + "\\Repositories", StringFormatter.CleanUpClassName(table.Name) + _script.Settings.DataOptions.ClassSuffix.Name + ".cs"), SaveActions.DontOverwrite);
  217. }
  218. private void RenderDataContextClass()
  219. {
  220. _hdrUtil.WriteClassHeader(_output);
  221. _output.autoTabLn("using System.Data.Entity;");
  222. _output.autoTabLn("using System.Data.Entity.ModelConfiguration.Conventions;");
  223. _output.autoTabLn("using System.Linq;");
  224. _output.autoTabLn("using " + _script.Settings.BusinessObjects.BusinessObjectsNamespace + ";");
  225. _output.autoTabLn("using " + _script.Settings.DataOptions.DataObjectsNamespace + ".Generated;");
  226. _output.autoTabLn("");
  227. _output.autoTabLn("namespace " + _script.Settings.DataOptions.DataObjectsNamespace);
  228. _output.autoTabLn("{");
  229. _output.tabLevel++;
  230. _output.autoTabLn("public class " + _script.Settings.DataOptions.DataContext.Name + " : DataObjectsBase");
  231. _output.autoTabLn("{");
  232. _output.autoTabLn("");
  233. _output.tabLevel++;
  234. _output.autoTabLn("#region ctors");
  235. _output.autoTabLn("public " + _script.Settings.DataOptions.DataContext.Name + "(string connectionString)");
  236. _output.tabLevel++;
  237. _output.autoTabLn(": base(connectionString)");
  238. _output.tabLevel--;
  239. _output.autoTabLn("{");
  240. _output.tabLevel++;
  241. _output.autoTabLn("Database.SetInitializer<" + _script.Settings.DataOptions.DataContext.Name + ">(null);");
  242. _output.tabLevel--;
  243. _output.autoTabLn("}");
  244. _output.autoTabLn("#endregion");
  245. _output.autoTabLn("");
  246. _output.autoTabLn("#region Public Methods");
  247. _output.autoTabLn("");
  248. _output.autoTabLn("public virtual void Commit()");
  249. _output.autoTabLn("{");
  250. _output.tabLevel++;
  251. _output.autoTabLn("base.SaveChanges();");
  252. _output.tabLevel--;
  253. _output.autoTabLn("}");
  254. _output.autoTabLn("");
  255. _output.autoTabLn("#endregion");
  256. _output.autoTabLn("");
  257. _output.autoTabLn("#region Overrides");
  258. _output.autoTabLn("");
  259. _output.autoTabLn("protected override void OnModelCreating(DbModelBuilder modelBuilder)");
  260. _output.autoTabLn("{");
  261. _output.tabLevel++;
  262. _output.autoTabLn("modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();");
  263. // Include mappings for entities with schema names.
  264. _output.autoTabLn("");
  265. foreach (string tableName in _script.Tables)
  266. {
  267. ITable table = _database.Tables[tableName];
  268. if (table.Schema.ToLower() != "dbo")
  269. {
  270. _output.autoTabLn("modelBuilder.Entity<" + StringFormatter.CleanUpClassName(tableName) + ">().ToTable(\"" + StringFormatter.CleanUpClassName(tableName) + "\", \"" + table.Schema + "\");");
  271. }
  272. }
  273. _output.tabLevel--;
  274. _output.autoTabLn("}");
  275. _output.autoTabLn("");
  276. _output.autoTabLn("#endregion");
  277. _output.autoTabLn("");
  278. _output.tabLevel--;
  279. _output.autoTabLn("}");
  280. _output.tabLevel--;
  281. _output.autoTabLn("}");
  282. _output.autoTabLn("");
  283. _context.FileList.Add(" " + _script.Settings.DataOptions.DataContext.Name + ".cs");
  284. SaveOutput(CreateFullPath(_script.Settings.DataOptions.DataObjectsNamespace, _script.Settings.DataOptions.DataContext.Name + ".cs"), SaveActions.DontOverwrite);
  285. }
  286. private void RenderDataObjectFactory()
  287. {
  288. _hdrUtil.WriteClassHeader(_output);
  289. _output.autoTabLn("using System;");
  290. _output.autoTabLn("using System.Configuration;");
  291. _output.autoTabLn("using System.Linq;");
  292. _output.autoTabLn("");
  293. _output.autoTabLn("namespace " + _script.Settings.DataOptions.DataObjectsNamespace);
  294. _output.autoTabLn("{");
  295. _output.tabLevel++;
  296. _output.autoTabLn("public static class DataObjectFactory");
  297. _output.autoTabLn("{");
  298. _output.tabLevel++;
  299. _output.autoTabLn("private static readonly string _connectionString;");
  300. _output.autoTabLn("");
  301. _output.autoTabLn("/// <summary>");
  302. _output.autoTabLn("/// Static constructor. Reads the connectionstring from web.config just once.");
  303. _output.autoTabLn("/// </summary>");
  304. _output.autoTabLn("static DataObjectFactory()");
  305. _output.autoTabLn("{");
  306. _output.tabLevel++;
  307. _output.autoTabLn("string connectionStringName = ConfigurationManager.AppSettings.Get(\"ConnectionStringName\");");
  308. _output.autoTabLn("_connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;");
  309. _output.tabLevel--;
  310. _output.autoTabLn("}");
  311. _output.autoTabLn("");
  312. _output.autoTabLn("/// <summary>");
  313. _output.autoTabLn("/// Creates the Context using the current connectionstring.");
  314. _output.autoTabLn("/// </summary>");
  315. _output.autoTabLn("/// <remarks>");
  316. _output.autoTabLn("/// Gof pattern: Factory method. ");
  317. _output.autoTabLn("/// </remarks>");
  318. _output.autoTabLn("/// <returns>DbContext.</returns>");
  319. _output.autoTabLn("public static " + _script.Settings.DataOptions.DataContext.Name + " CreateContext()");
  320. _output.autoTabLn("{");
  321. _output.tabLevel++;
  322. _output.autoTabLn("return new " + _script.Settings.DataOptions.DataContext.Name + "(_connectionString);");
  323. _output.tabLevel--;
  324. _output.autoTabLn("}");
  325. _output.tabLevel--;
  326. _output.autoTabLn("}");
  327. _output.tabLevel--;
  328. _output.autoTabLn("}");
  329. _context.FileList.Add(" DataObjectFactory.cs");
  330. SaveOutput(CreateFullPath(_script.Settings.DataOptions.DataObjectsNamespace, "DataObjectFactory.cs"), SaveActions.DontOverwrite);
  331. }
  332. private void RenderRepositoryBaseClass()
  333. {
  334. _hdrUtil.WriteClassHeader(_output);
  335. _output.autoTabLn("using System;");
  336. _output.autoTabLn("using System.Collections.Generic;");
  337. _output.autoTabLn("using System.Data;");
  338. _output.autoTabLn("using System.Data.Entity;");
  339. _output.autoTabLn("using System.Linq;");
  340. _output.autoTabLn("using System.Linq.Expressions;");
  341. _output.autoTabLn("");
  342. _output.autoTabLn("namespace " + _script.Settings.DataOptions.DataObjectsNamespace);
  343. _output.autoTabLn("{");
  344. _output.tabLevel++;
  345. _output.autoTabLn("public abstract class RepositoryBase<TEntity> where TEntity : class");
  346. _output.autoTabLn("{");
  347. _output.tabLevel++;
  348. _output.autoTabLn("#region Locals");
  349. _output.autoTabLn("");
  350. _output.autoTabLn("internal " + _script.Settings.DataOptions.DataContext.Name + " _context;");
  351. _output.autoTabLn("internal IDbSet<TEntity> _dbSet;");
  352. _output.autoTabLn("");
  353. _output.autoTabLn("#endregion");
  354. _output.autoTabLn("");
  355. _output.autoTabLn("#region ctors");
  356. _output.autoTabLn("private readonly IUnitOfWork _unitOfWork;");
  357. _output.autoTabLn("");
  358. _output.autoTabLn("public RepositoryBase(IUnitOfWork unitOfWork)");
  359. _output.autoTabLn("{");
  360. _output.tabLevel++;
  361. _output.autoTabLn("this._unitOfWork = unitOfWork;");
  362. _output.autoTabLn("this._dbSet = " + _script.Settings.DataOptions.DataContext.Name + ".Set<TEntity>();");
  363. _output.tabLevel--;
  364. _output.autoTabLn("}");
  365. _output.autoTabLn("");
  366. _output.autoTabLn("#endregion");
  367. _output.autoTabLn("");
  368. _output.autoTabLn("#region Public CRUD Methods");
  369. _output.autoTabLn("");
  370. _output.autoTabLn("public virtual IQueryable<TEntity> GetAll()");
  371. _output.autoTabLn("{");
  372. _output.tabLevel++;
  373. _output.autoTabLn("IQueryable<TEntity> query = _dbSet;");
  374. _output.autoTabLn("");
  375. _output.autoTabLn("return query;");
  376. _output.tabLevel--;
  377. _output.autoTabLn("}");
  378. _output.autoTabLn("");
  379. _output.autoTabLn("public virtual IEnumerable<TEntity> Get(");
  380. _output.tabLevel++;
  381. _output.autoTabLn("Expression<Func<TEntity, bool>> filter = null,");
  382. _output.autoTabLn("Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,");
  383. _output.autoTabLn("string includeProperties = \"\")");
  384. _output.tabLevel--;
  385. _output.autoTabLn("{");
  386. _output.tabLevel++;
  387. _output.autoTabLn("IQueryable<TEntity> query = _dbSet;");
  388. _output.autoTabLn("");
  389. _output.autoTabLn("if (filter != null)");
  390. _output.autoTabLn("{");
  391. _output.tabLevel++;
  392. _output.autoTabLn("query = query.Where(filter);");
  393. _output.tabLevel--;
  394. _output.autoTabLn("}");
  395. _output.autoTabLn("");
  396. _output.autoTabLn("foreach (var includeProperty in includeProperties.Split");
  397. _output.tabLevel++;
  398. _output.autoTabLn("(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))");
  399. _output.tabLevel--;
  400. _output.autoTabLn("{");
  401. _output.tabLevel++;
  402. _output.autoTabLn("query = query.Include(includeProperty);");
  403. _output.tabLevel--;
  404. _output.autoTabLn("}");
  405. _output.autoTabLn("");
  406. _output.autoTabLn("if (orderBy != null)");
  407. _output.autoTabLn("{");
  408. _output.tabLevel++;
  409. _output.autoTabLn("return orderBy(query);");
  410. _output.tabLevel--;
  411. _output.autoTabLn("}");
  412. _output.autoTabLn("else");
  413. _output.autoTabLn("{");
  414. _output.tabLevel++;
  415. _output.autoTabLn("return query;");
  416. _output.tabLevel--;
  417. _output.autoTabLn("}");
  418. _output.tabLevel--;
  419. _output.autoTabLn("}");
  420. _output.autoTabLn("");
  421. _output.autoTabLn("public virtual TEntity GetById(object id)");
  422. _output.autoTabLn("{");
  423. _output.tabLevel++;
  424. _output.autoTabLn("return _dbSet.Find(id);");
  425. _output.tabLevel--;
  426. _output.autoTabLn("}");
  427. _output.autoTabLn("");
  428. _output.autoTabLn("public virtual void Insert(TEntity entity)");
  429. _output.autoTabLn("{");
  430. _output.tabLevel++;
  431. _output.autoTabLn("_dbSet.Add(entity);");
  432. _output.tabLevel--;
  433. _output.autoTabLn("}");
  434. _output.autoTabLn("");
  435. _output.autoTabLn("public virtual void Delete(object id)");
  436. _output.autoTabLn("{");
  437. _output.tabLevel++;
  438. _output.autoTabLn("TEntity entityToDelete = _dbSet.Find(id);");
  439. _output.autoTabLn("Delete(entityToDelete);");
  440. _output.tabLevel--;
  441. _output.autoTabLn("}");
  442. _output.autoTabLn("");
  443. _output.autoTabLn("public virtual void Delete(TEntity entityToDelete)");
  444. _output.autoTabLn("{");
  445. // Check which version of Entity Framework is being used.
  446. _output.tabLevel++;
  447. if (_criteria == null)
  448. {
  449. _output.autoTabLn("if (_context.Entry(entityToDelete).State == EntityState.Detached)");
  450. }
  451. else
  452. {
  453. if (_criteria.EFVersion >= 6.0)
  454. {
  455. // Entity Framework 6.x
  456. _output.autoTabLn("if (_context.Entry(entityToDelete).State == System.Data.Entity.EntityState.Detached)");
  457. }
  458. else
  459. {
  460. // Entity Framework 5.0 and below
  461. //_output.autoTabLn("// If this line goes red, then you are using Entity Framework 6.x");
  462. //_output.autoTabLn("// You need to change the line to this:");
  463. //_output.autoTabLn("// _context.Entry(entityToDelete).State == System.Data.Entity.EntityState.Detached");
  464. _output.autoTabLn("if (_context.Entry(entityToDelete).State == EntityState.Detached)");
  465. }
  466. }
  467. _output.autoTabLn("{");
  468. _output.tabLevel++;
  469. _output.autoTabLn("_dbSet.Attach(entityToDelete);");
  470. _output.tabLevel--;
  471. _output.autoTabLn("}");
  472. _output.autoTabLn("_dbSet.Remove(entityToDelete);");
  473. _output.tabLevel--;
  474. _output.autoTabLn("}");
  475. _output.autoTabLn("");
  476. _output.autoTabLn("public virtual void Update(TEntity entityToUpdate)");
  477. _output.autoTabLn("{");
  478. _output.tabLevel++;
  479. _output.autoTabLn("_dbSet.Attach(entityToUpdate);");
  480. //_output.autoTabLn("// If this line goes red, then you are using Entity Framework 6.x");
  481. //_output.autoTabLn("// You need to change the line to this:");
  482. //_output.autoTabLn("// _context.Entry(entityToUpdate).State == System.Data.Entity.EntityState.Modified");
  483. if (_criteria.EFVersion >= 6.0)
  484. {
  485. _output.autoTabLn("_context.Entry(entityToUpdate).State = System.Data.Entity.EntityState.Modified;");
  486. }
  487. else
  488. {
  489. _output.autoTabLn("_context.Entry(entityToUpdate).State = EntityState.Modified;");
  490. }
  491. _output.tabLevel--;
  492. _output.autoTabLn("}");
  493. _output.autoTabLn("#endregion");
  494. _output.autoTabLn("");
  495. _output.autoTabLn("#region Protected Members");
  496. _output.autoTabLn("");
  497. _output.autoTabLn("protected " + _script.Settings.DataOptions.DataContext.Name + " " + _script.Settings.DataOptions.DataContext.Name + "");
  498. _output.autoTabLn("{");
  499. _output.tabLevel++;
  500. _output.autoTabLn("get");
  501. _output.autoTabLn("{");
  502. _output.tabLevel++;
  503. _output.autoTabLn("return _context ?? (_context = _unitOfWork." + _script.Settings.DataOptions.DataContext.Name + ");");
  504. _output.tabLevel--;
  505. _output.autoTabLn("}");
  506. _output.tabLevel--;
  507. _output.autoTabLn("}");
  508. _output.autoTabLn("");
  509. _output.autoTabLn("#endregion");
  510. _output.autoTabLn("");
  511. _output.tabLevel--;
  512. _output.autoTabLn("}");
  513. _output.tabLevel--;
  514. _output.autoTabLn("}");
  515. _context.FileList.Add(" RepositoryBase.cs");
  516. SaveOutput(CreateFullPath(_script.Settings.DataOptions.DataObjectsNamespace, "RepositoryBase.cs"), SaveActions.DontOverwrite);
  517. }
  518. private void RenderUnitOfWorkClass()
  519. {
  520. _hdrUtil.WriteClassHeader(_output);
  521. _output.autoTabLn("using System;");
  522. _output.autoTabLn("using System.Linq;");
  523. _output.autoTabLn("");
  524. _output.autoTabLn("namespace " + _script.Settings.DataOptions.DataObjectsNamespace);
  525. _output.autoTabLn("{");
  526. _output.tabLevel++;
  527. _output.autoTabLn("public class UnitOfWork : Disposable, IUnitOfWork");
  528. _output.autoTabLn("{");
  529. _output.tabLevel++;
  530. _output.autoTabLn("private " + _script.Settings.DataOptions.DataContext.Name + " _context;");
  531. _output.autoTabLn("");
  532. _output.autoTabLn("public " + _script.Settings.DataOptions.DataContext.Name + " " + _script.Settings.DataOptions.DataContext.Name + "");
  533. _output.autoTabLn("{");
  534. _output.tabLevel++;
  535. _output.autoTabLn("get");
  536. _output.autoTabLn("{");
  537. _output.tabLevel++;
  538. _output.autoTabLn("return _context ?? (_context = DataObjectFactory.CreateContext());");
  539. _output.tabLevel--;
  540. _output.autoTabLn("}");
  541. _output.tabLevel--;
  542. _output.autoTabLn("}");
  543. _output.autoTabLn("");
  544. _output.autoTabLn("public void Commit()");
  545. _output.autoTabLn("{");
  546. _output.tabLevel++;
  547. _output.autoTabLn(_script.Settings.DataOptions.DataContext.Name + ".Commit();");
  548. _output.tabLevel--;
  549. _output.autoTabLn("}");
  550. _output.autoTabLn("");
  551. _output.autoTabLn("protected override void DisposeCore()");
  552. _output.autoTabLn("{");
  553. _output.tabLevel++;
  554. _output.autoTabLn("if (_context != null)");
  555. _output.autoTabLn("{");
  556. _output.tabLevel++;
  557. _output.autoTabLn("_context.Dispose();");
  558. _output.tabLevel--;
  559. _output.autoTabLn("}");
  560. _output.tabLevel--;
  561. _output.autoTabLn("}");
  562. _output.tabLevel--;
  563. _output.autoTabLn("}");
  564. _output.tabLevel--;
  565. _output.autoTabLn("}");
  566. _context.FileList.Add(" UnitOfWork.cs");
  567. SaveOutput(CreateFullPath(_script.Settings.DataOptions.DataObjectsNamespace, "UnitOfWork.cs"), SaveActions.DontOverwrite);
  568. }
  569. private void RenderUnitOfWorkInterface()
  570. {
  571. _hdrUtil.WriteClassHeader(_output);
  572. _output.autoTabLn("namespace " + _script.Settings.DataOptions.DataObjectsNamespace);
  573. _output.autoTabLn("{");
  574. _output.tabLevel++;
  575. _output.autoTabLn("public interface IUnitOfWork");
  576. _output.autoTabLn("{");
  577. _output.tabLevel++;
  578. _output.autoTabLn(_script.Settings.DataOptions.DataContext.Name + " " + _script.Settings.DataOptions.DataContext.Name + " { get; }");
  579. _output.autoTabLn("");
  580. _output.autoTabLn("void Commit();");
  581. _output.tabLevel--;
  582. _output.autoTabLn("}");
  583. _output.tabLevel--;
  584. _output.autoTabLn("}");
  585. _context.FileList.Add(" IUnitOfWork.cs");
  586. SaveOutput(CreateFullPath(_script.Settings.DataOptions.DataObjectsNamespace, "IUnitOfWork.cs"), SaveActions.DontOverwrite);
  587. }
  588. private void RenderDisposableClass()
  589. {
  590. _hdrUtil.WriteClassHeader(_output);
  591. _output.autoTabLn("using System;");
  592. _output.autoTabLn("using System.Linq;");
  593. _output.autoTabLn("");
  594. _output.autoTabLn("namespace " + _script.Settings.DataOptions.DataObjectsNamespace);
  595. _output.autoTabLn("{");
  596. _output.tabLevel++;
  597. _output.autoTabLn("public abstract class Disposable : IDisposable");
  598. _output.autoTabLn("{");
  599. _output.tabLevel++;
  600. _output.autoTabLn("private bool isDisposed;");
  601. _output.autoTabLn("");
  602. _output.autoTabLn("~Disposable()");
  603. _output.autoTabLn("{");
  604. _output.tabLevel++;
  605. _output.autoTabLn("Dispose(false);");
  606. _output.tabLevel--;
  607. _output.autoTabLn("}");
  608. _output.autoTabLn("");
  609. _output.autoTabLn("protected virtual void DisposeCore()");
  610. _output.autoTabLn("{");
  611. _output.autoTabLn("");
  612. _output.autoTabLn("}");
  613. _output.autoTabLn("");
  614. _output.autoTabLn("private void Dispose(bool disposing)");
  615. _output.autoTabLn("{");
  616. _output.tabLevel++;
  617. _output.autoTabLn("if (!isDisposed && disposing)");
  618. _output.autoTabLn("{");
  619. _output.tabLevel++;
  620. _output.autoTabLn("DisposeCore();");
  621. _output.tabLevel--;
  622. _output.autoTabLn("}");
  623. _output.autoTabLn("");
  624. _output.autoTabLn("isDisposed = true;");
  625. _output.tabLevel--;
  626. _output.autoTabLn("}");
  627. _output.autoTabLn("");
  628. _output.autoTabLn("public void Dispose()");
  629. _output.autoTabLn("{");
  630. _output.tabLevel++;
  631. _output.autoTabLn("Dispose(true);");
  632. _output.autoTabLn("GC.SuppressFinalize(this);");
  633. _output.tabLevel--;
  634. _output.autoTabLn("}");
  635. _output.tabLevel--;
  636. _output.autoTabLn("}");
  637. _output.tabLevel--;
  638. _output.autoTabLn("}");
  639. _context.FileList.Add(" Disposable.cs");
  640. SaveOutput(CreateFullPath(_script.Settings.DataOptions.DataObjectsNamespace, "Disposable.cs"), SaveActions.DontOverwrite);
  641. }
  642. #endregion
  643. }
  644. }