コード例 #1
0
		public void ModelWithReferencesAndAutoAndLazySetup()
		{
			var model = PersistentModel.Compile(@"
class a prototype=dbtable 
class b prototype=dbtable
	ref a reverse auto reverse-lazy
class c prototype=dbtable
	ref b reverse reverse-auto lazy
");
			var code = new ExtendedModelWriter(model) { WithHeader = false }.ToString();
			Console.WriteLine(code.Replace("\"", "\"\""));
			Assert.AreEqual(@"
using System;
using Qorpent.Data;
using Qorpent.Log;
using Qorpent.IoC;
using Qorpent.Data.Connections;
using Qorpent.Data.DataCache;
using System.Linq;
using System.Collections.Generic;
using Orm.ObjectCaches;
namespace Orm.Adapters {
	///<summary>Model for Orm definition</summary>
	public partial class Model {

		private IUserLog _log;
		private IDatabaseConnectionProvider _connectionProvider;
		private IUserLog _sqlLog;
		/// <summary>
		/// Внешние провайдеры данных
		/// </summary>
		[Inject]
		public IList<IExternalDataProvider> ExternalProviders{
			get { return _externalProviders ?? (_externalProviders =  new List<IExternalDataProvider>()); }
			set { _externalProviders = value; }
		}
		private IList<IExternalDataProvider> _externalProviders;
		///<summary>initiator for caches</summary>
		protected ObjectDataCache<T> InitCache<T>()where T:class,new(){
			var result = CreateCache<T>();
			result.Adapter = GetAdapter<T>();
			result.ConnectionProvider = ConnectionProvider; 
			result.Log = Log; 
			result.SqlLog = SqlLog;
			result.ConnectionString = ConnectionString;
			result.ExternalProviders = this.ExternalProviders;
			SetupLoadBehavior(result);
			return result;
		}
		///<summary>initiator for caches</summary>
		protected ObjectDataCache<T> CreateCache<T>() where T:class,new(){
			
if(typeof(T)==typeof(a))return (new aDataCache{Model=this}) as ObjectDataCache<T>;
if(typeof(T)==typeof(b))return (new bDataCache{Model=this}) as ObjectDataCache<T>;
if(typeof(T)==typeof(c))return (new cDataCache{Model=this}) as ObjectDataCache<T>;

			return null;
		}
		///<summary>
		///Sql connection descriptor
		///</summary>
		public string ConnectionString{get;set;}
		/// <summary>
		/// Служба генерации соединений
		/// </summary>
		[Inject]
		public  IDatabaseConnectionProvider ConnectionProvider{
			get { return _connectionProvider??(_connectionProvider =new DatabaseConnectionProvider{IgnoreDefaultApplication = true}); }
			set { _connectionProvider = value; }
		}
		/// <summary>
		/// Журнал общих событий
		/// </summary>
		public IUserLog Log{
			get { return _log ?? (_log= StubUserLog.Default); }
			set { _log = value; }
		}

		/// <summary>
		/// Журнал событий SQL
		/// </summary>
		public IUserLog SqlLog{
			get { return _sqlLog ?? (_sqlLog=StubUserLog.Default); }
			set{
				_sqlLog = value;
			}
		}
		private aDataCache _aCache;
		///<summary>Cache of a</summary>
		public aDataCache a {get { return _aCache ?? (_aCache = (aDataCache)InitCache<a>());}}
		private bDataCache _bCache;
		///<summary>Cache of b</summary>
		public bDataCache b {get { return _bCache ?? (_bCache = (bDataCache)InitCache<b>());}}
		private cDataCache _cCache;
		///<summary>Cache of c</summary>
		public cDataCache c {get { return _cCache ?? (_cCache = (cDataCache)InitCache<c>());}}
		///<summary>Setup auto load behavior for linked classes</summary>
		protected virtual void SetupLoadBehavior<T>(ObjectDataCache<T> cache)where T:class,new(){
			switch(typeof(T).Name){
				case ""a"" : SetupaLoadBehavior(cache as ObjectDataCache<a>);break;
				case ""b"" : SetupbLoadBehavior(cache as ObjectDataCache<b>);break;
				case ""c"" : SetupcLoadBehavior(cache as ObjectDataCache<c>);break;
				default: break;
			}
		}
		///<summary></summary>
		protected void SetupaLoadBehavior(ObjectDataCache<a> cache){
			cache.OnAfterUpdateCache+= (s,ids,c,ctx) => {
				var mycache = s as ObjectDataCache<a>;
				ctx = ctx??ObjectDataCacheHints.Empty;
				var targets = ids.Select(_=>mycache.Get(_,c)).ToArray();
				foreach(var t in targets){
					if(t.Id == -1||t.Id==0)continue;
				}
				if (ids.Count > 0 && !(ids.Count == 1 && (ids[0] == 0 || ids[0]==-1))){
					var inids = string.Join("","",ids.Where(_=>_!=0 && _!=-1));
					if((AutoLoadabs) && !ctx.NoChildren){
						var q = string.Format(""(a in ({0}))"",inids);
						if(Lazyabs){
							foreach(var t in targets){
								if(t.Id == -1||t.Id==0)continue;
								t.bs= new ObjectDataCacheBindLazyList<b>{Query=q,Cache=this.b};
							}
						}else{
							var nestIds = this.b.UpdateSingleQuery(q, ctx,c, null, true);
							foreach(var nid in nestIds){
								var n=this.b.Get(nid);
								var t=cache.Get(n.aId);
								if (!t.bs.Contains(n)) {
									t.bs.Add(n);
								}
							}
						}
					}
				}
			};
		}
		///<summary></summary>
		protected void SetupbLoadBehavior(ObjectDataCache<b> cache){
			cache.OnAfterUpdateCache+= (s,ids,c,ctx) => {
				var mycache = s as ObjectDataCache<b>;
				ctx = ctx??ObjectDataCacheHints.Empty;
				var targets = ids.Select(_=>mycache.Get(_,c)).ToArray();
				foreach(var t in targets){
					if(t.Id == -1||t.Id==0)continue;
					if(AutoLoadba && null==t.a){
						t.a= (!Lazyba?(this.a.Get(t.aId,c)): new a.Lazy{GetLazy=_=>this.a.Get(t.aId)});
if (!Lazyabs && !Lazyba && t.aId != 0 && t.aId != -1)
			{
				if (!t.a.bs.Contains(t))
				{
					t.a.bs.Add(t);
				}
			}
					}
				}
				if (ids.Count > 0 && !(ids.Count == 1 && (ids[0] == 0 || ids[0]==-1))){
					var inids = string.Join("","",ids.Where(_=>_!=0 && _!=-1));
					if((AutoLoadbcs) && !ctx.NoChildren){
						var q = string.Format(""(b in ({0}))"",inids);
						if(Lazybcs){
							foreach(var t in targets){
								if(t.Id == -1||t.Id==0)continue;
								t.cs= new ObjectDataCacheBindLazyList<c>{Query=q,Cache=this.c};
							}
						}else{
							var nestIds = this.c.UpdateSingleQuery(q, ctx,c, null, true);
							foreach(var nid in nestIds){
								var n=this.c.Get(nid);
								var t=cache.Get(n.bId);
								if (!t.cs.Contains(n)) {
									t.cs.Add(n);
								}
							}
						}
					}
				}
			};
		}
		///<summary></summary>
		protected void SetupcLoadBehavior(ObjectDataCache<c> cache){
			cache.OnAfterUpdateCache+= (s,ids,c,ctx) => {
				var mycache = s as ObjectDataCache<c>;
				ctx = ctx??ObjectDataCacheHints.Empty;
				var targets = ids.Select(_=>mycache.Get(_,c)).ToArray();
				foreach(var t in targets){
					if(t.Id == -1||t.Id==0)continue;
					if(AutoLoadcb && null==t.b){
						t.b= (!Lazycb?(this.b.Get(t.bId,c)): new b.Lazy{GetLazy=_=>this.b.Get(t.bId)});
if (!Lazybcs && !Lazycb && t.bId != 0 && t.bId != -1)
			{
				if (!t.b.cs.Contains(t))
				{
					t.b.cs.Add(t);
				}
			}
					}
				}
			};
		}
	}
}
".Trim().LfOnly(), code.Trim().LfOnly());
		}
コード例 #2
0
		public void SimplestModel()
		{
			var model = PersistentModel.Compile(@"
class a prototype=dbtable
");
			var code = new ExtendedModelWriter(model) { WithHeader = false }.ToString();
			Console.WriteLine(code.Replace("\"", "\"\""));
			Assert.AreEqual(@"
using System;
using Qorpent.Data;
using Qorpent.Log;
using Qorpent.IoC;
using Qorpent.Data.Connections;
using Qorpent.Data.DataCache;
using System.Linq;
using System.Collections.Generic;
using Orm.ObjectCaches;
namespace Orm.Adapters {
	///<summary>Model for Orm definition</summary>
	public partial class Model {

		private IUserLog _log;
		private IDatabaseConnectionProvider _connectionProvider;
		private IUserLog _sqlLog;
		/// <summary>
		/// Внешние провайдеры данных
		/// </summary>
		[Inject]
		public IList<IExternalDataProvider> ExternalProviders{
			get { return _externalProviders ?? (_externalProviders =  new List<IExternalDataProvider>()); }
			set { _externalProviders = value; }
		}
		private IList<IExternalDataProvider> _externalProviders;
		///<summary>initiator for caches</summary>
		protected ObjectDataCache<T> InitCache<T>()where T:class,new(){
			var result = CreateCache<T>();
			result.Adapter = GetAdapter<T>();
			result.ConnectionProvider = ConnectionProvider; 
			result.Log = Log; 
			result.SqlLog = SqlLog;
			result.ConnectionString = ConnectionString;
			result.ExternalProviders = this.ExternalProviders;
			SetupLoadBehavior(result);
			return result;
		}
		///<summary>initiator for caches</summary>
		protected ObjectDataCache<T> CreateCache<T>() where T:class,new(){
			
if(typeof(T)==typeof(a))return (new aDataCache{Model=this}) as ObjectDataCache<T>;

			return null;
		}
		///<summary>
		///Sql connection descriptor
		///</summary>
		public string ConnectionString{get;set;}
		/// <summary>
		/// Служба генерации соединений
		/// </summary>
		[Inject]
		public  IDatabaseConnectionProvider ConnectionProvider{
			get { return _connectionProvider??(_connectionProvider =new DatabaseConnectionProvider{IgnoreDefaultApplication = true}); }
			set { _connectionProvider = value; }
		}
		/// <summary>
		/// Журнал общих событий
		/// </summary>
		public IUserLog Log{
			get { return _log ?? (_log= StubUserLog.Default); }
			set { _log = value; }
		}

		/// <summary>
		/// Журнал событий SQL
		/// </summary>
		public IUserLog SqlLog{
			get { return _sqlLog ?? (_sqlLog=StubUserLog.Default); }
			set{
				_sqlLog = value;
			}
		}
		private aDataCache _aCache;
		///<summary>Cache of a</summary>
		public aDataCache a {get { return _aCache ?? (_aCache = (aDataCache)InitCache<a>());}}
		///<summary>Setup auto load behavior for linked classes</summary>
		protected virtual void SetupLoadBehavior<T>(ObjectDataCache<T> cache)where T:class,new(){
			switch(typeof(T).Name){
				case ""a"" : SetupaLoadBehavior(cache as ObjectDataCache<a>);break;
				default: break;
			}
		}
		///<summary></summary>
		protected void SetupaLoadBehavior(ObjectDataCache<a> cache){
			cache.OnAfterUpdateCache+= (s,ids,c,ctx) => {
				var mycache = s as ObjectDataCache<a>;
				ctx = ctx??ObjectDataCacheHints.Empty;
				var targets = ids.Select(_=>mycache.Get(_,c)).ToArray();
				foreach(var t in targets){
					if(t.Id == -1||t.Id==0)continue;
				}
			};
		}
	}
}
".Trim().LfOnly(), code.Trim().LfOnly());
		}