Mercurial > pub > bltoolkit
diff Source/Reflection/MetadataProvider/LinqMetadataProvider.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Reflection/MetadataProvider/LinqMetadataProvider.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,239 @@ +using System; +using System.Data.Linq.Mapping; +using System.Linq; + +namespace BLToolkit.Reflection.MetadataProvider +{ + using DataAccess; + using Mapping; + using Extension; + + public class LinqMetadataProvider : MetadataProviderBase + { + #region Helpers + + private Type _type; + private bool? _isLinqObject; + readonly object _sync = new object(); + + void EnsureMapper(Type type) + { + if (_type != type) + { + _type = type; + _isLinqObject = null; + } + } + + bool IsLinqObject(Type type) + { + lock (_sync) + { + EnsureMapper(type); + + if (_isLinqObject == null) + { + var attrs = type.GetCustomAttributes(typeof(TableAttribute), true); + _isLinqObject = attrs.Length > 0; + } + + return _isLinqObject.Value; + } + } + + #endregion + + #region GetFieldName + + public override string GetFieldName(TypeExtension typeExtension, MemberAccessor member, out bool isSet) + { + if (IsLinqObject(member.TypeAccessor.Type)) + { + var a = member.GetAttribute<ColumnAttribute>(); + + if (a != null && !string.IsNullOrEmpty(a.Name)) + { + isSet = true; + return a.Name; + } + } + + return base.GetFieldName(typeExtension, member, out isSet); + } + + #endregion + + #region GetFieldStorage + + public override string GetFieldStorage(TypeExtension typeExtension, MemberAccessor member, out bool isSet) + { + if (IsLinqObject(member.TypeAccessor.Type)) + { + var a = member.GetAttribute<ColumnAttribute>(); + + if (a != null && !string.IsNullOrEmpty(a.Name)) + { + isSet = true; + return a.Storage; + } + } + + return base.GetFieldStorage(typeExtension, member, out isSet); + } + + #endregion + + #region GetInheritanceDiscriminator + + public override bool GetInheritanceDiscriminator(TypeExtension typeExtension, MemberAccessor member, out bool isSet) + { + if (IsLinqObject(member.TypeAccessor.Type)) + { + var a = member.GetAttribute<ColumnAttribute>(); + + if (a != null && !string.IsNullOrEmpty(a.Name)) + { + isSet = true; + return a.IsDiscriminator; + } + } + + return base.GetInheritanceDiscriminator(typeExtension, member, out isSet); + } + + #endregion + + #region GetMapIgnore + + public override bool GetMapIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet) + { + if (member.GetAttribute<AssociationAttribute>() != null) + { + isSet = true; + return true; + } + + if (IsLinqObject(member.TypeAccessor.Type)) + { + isSet = true; + return member.GetAttribute<ColumnAttribute>() == null; + } + + return base.GetMapIgnore(typeExtension, member, out isSet); + } + + #endregion + + #region GetNullable + + public override bool GetNullable(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet) + { + if (IsLinqObject(member.TypeAccessor.Type)) + { + var attr = member.GetAttribute<ColumnAttribute>(); + + if (attr != null) + { + isSet = true; + return attr.CanBeNull; + } + } + + return base.GetNullable(mappingSchema, typeExtension, member, out isSet); + } + + #endregion + + #region GetTableName + + public override string GetTableName(Type type, ExtensionList extensions, out bool isSet) + { + if (IsLinqObject(type)) + { + isSet = true; + + var attrs = type.GetCustomAttributes(typeof(TableAttribute), true); + + return ((TableAttribute)attrs[0]).Name; + } + + return base.GetTableName(type, extensions, out isSet); + } + + #endregion + + #region GetPrimaryKeyOrder + + public override int GetPrimaryKeyOrder(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet) + { + if (IsLinqObject(type)) + { + ColumnAttribute a = member.GetAttribute<ColumnAttribute>(); + + if (a != null && a.IsPrimaryKey) + { + isSet = true; + return 0; + } + } + + return base.GetPrimaryKeyOrder(type, typeExt, member, out isSet); + } + + #endregion + + #region GetNonUpdatableFlag + + public override NonUpdatableAttribute GetNonUpdatableAttribute(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet) + { + if (IsLinqObject(member.TypeAccessor.Type)) + { + var a = member.GetAttribute<ColumnAttribute>(); + + if (a != null) + { + isSet = true; + return a.IsDbGenerated ? new IdentityAttribute() : null; + } + } + + return base.GetNonUpdatableAttribute(type, typeExt, member, out isSet); + } + + #endregion + + #region GetAssociation + + public override Association GetAssociation(TypeExtension typeExtension, MemberAccessor member) + { + if (IsLinqObject(member.TypeAccessor.Type)) + { + var a = member.GetAttribute<System.Data.Linq.Mapping.AssociationAttribute>(); + + if (a != null) + return new Association(member, Association.ParseKeys(a.ThisKey), Association.ParseKeys(a.OtherKey), a.Storage, true); + } + + return base.GetAssociation(typeExtension, member); + } + + #endregion + + #region GetInheritanceMapping + + public override InheritanceMappingAttribute[] GetInheritanceMapping(Type type,TypeExtension typeExtension) + { + if (IsLinqObject(type)) + { + var attrs = type.GetCustomAttributes(typeof(InheritanceMappingAttribute), true); + + if (attrs.Length > 0) + return attrs.Select(a => (InheritanceMappingAttribute)a).ToArray(); + } + + return base.GetInheritanceMapping(type, typeExtension); + } + + #endregion + } +}