diff --git a/Examples/zore_entity/JObjectExtensions.cs b/Examples/zero_entity/JObjectExtensions.cs similarity index 100% rename from Examples/zore_entity/JObjectExtensions.cs rename to Examples/zero_entity/JObjectExtensions.cs diff --git a/Examples/zore_entity/Program.cs b/Examples/zero_entity/Program.cs similarity index 98% rename from Examples/zore_entity/Program.cs rename to Examples/zero_entity/Program.cs index 02ebcbd63..3c8f77e39 100644 --- a/Examples/zore_entity/Program.cs +++ b/Examples/zero_entity/Program.cs @@ -1,7 +1,7 @@  using FreeSql; using FreeSql.DataAnnotations; -using FreeSql.Extensions.ZoreEntity; +using FreeSql.Extensions.ZeroEntity; using FreeSql.Internal.Model; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -17,7 +17,7 @@ { var json = JsonConvert.SerializeObject(Helper.GetTestDesc()); - var dyctx = new ZoreDbContext(fsql, JsonConvert.DeserializeObject(@" + var dyctx = new ZeroDbContext(fsql, JsonConvert.DeserializeObject(@" [ { ""Name"":""User"", diff --git a/Examples/zore_entity/zore_entity.csproj b/Examples/zero_entity/zero_entity.csproj similarity index 90% rename from Examples/zore_entity/zore_entity.csproj rename to Examples/zero_entity/zero_entity.csproj index d21213be7..36cc0761d 100644 --- a/Examples/zore_entity/zore_entity.csproj +++ b/Examples/zero_entity/zero_entity.csproj @@ -12,7 +12,7 @@ - + diff --git a/Extensions/FreeSql.Extensions.ZoreEntity/FreeSql.Extensions.ZoreEntity.csproj b/Extensions/FreeSql.Extensions.ZeroEntity/FreeSql.Extensions.ZeroEntity.csproj similarity index 96% rename from Extensions/FreeSql.Extensions.ZoreEntity/FreeSql.Extensions.ZoreEntity.csproj rename to Extensions/FreeSql.Extensions.ZeroEntity/FreeSql.Extensions.ZeroEntity.csproj index 9c607287e..ef1e337ce 100644 --- a/Extensions/FreeSql.Extensions.ZoreEntity/FreeSql.Extensions.ZoreEntity.csproj +++ b/Extensions/FreeSql.Extensions.ZeroEntity/FreeSql.Extensions.ZeroEntity.csproj @@ -28,7 +28,7 @@ - FreeSql.Extensions.ZoreEntity.xml + FreeSql.Extensions.ZeroEntity.xml 3 diff --git a/Extensions/FreeSql.Extensions.ZoreEntity/FreeSql.Extensions.ZoreEntity.xml b/Extensions/FreeSql.Extensions.ZeroEntity/FreeSql.Extensions.ZeroEntity.xml similarity index 77% rename from Extensions/FreeSql.Extensions.ZoreEntity/FreeSql.Extensions.ZoreEntity.xml rename to Extensions/FreeSql.Extensions.ZeroEntity/FreeSql.Extensions.ZeroEntity.xml index 667a67a97..c868f116c 100644 --- a/Extensions/FreeSql.Extensions.ZoreEntity/FreeSql.Extensions.ZoreEntity.xml +++ b/Extensions/FreeSql.Extensions.ZeroEntity/FreeSql.Extensions.ZeroEntity.xml @@ -1,64 +1,64 @@ - FreeSql.Extensions.ZoreEntity + FreeSql.Extensions.ZeroEntity - + 【有状态管理】自动 Include 查询 - + 【无状态管理】指定表查询 - + Type = Update 的时候,获取更新之前的对象 - + 实体变化记录 - + 实体变化事件 - + 举例1:LeftJoin("table1", "id", "user.id") -> LEFT JOIN [table1] b ON b.[id] = a.[id] 举例2:LeftJoin("table1", "id", "user.id", "xid", "user.xid") -> LEFT JOIN [table1] b ON b.[id] = [a].id] AND b.[xid] = a.[xid] - + 举例1:InnerJoin("table1", "id", "user.id") -> INNER JOIN [table1] b ON b.[id] = a.[id] 举例2:InnerJoin("table1", "id", "user.id", "xid", "user.xid") -> INNER JOIN [table1] b ON b.[id] = [a].id] AND b.[xid] = a.[xid] - + 举例1:RightJoin("table1", "id", "user.id") -> RIGTH JOIN [table1] b ON b.[id] = a.[id] 举例2:RightJoin("table1", "id", "user.id", "xid", "user.xid") -> RIGTH JOIN [table1] b ON b.[id] = [a].id] AND b.[xid] = a.[xid] - + WHERE [Id] IN (...) - + Where(new { Year = 2017, CategoryId = 198, IsPublished = true }) WHERE [Year] = 2017 AND [CategoryId] = 198 AND [IsPublished] = 1 - + WHERE [field] = .. diff --git a/Extensions/FreeSql.Extensions.ZoreEntity/ZoreDbContext.SelectImpl.cs b/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.SelectImpl.cs similarity index 98% rename from Extensions/FreeSql.Extensions.ZoreEntity/ZoreDbContext.SelectImpl.cs rename to Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.SelectImpl.cs index 574f7d360..f5fda6b09 100644 --- a/Extensions/FreeSql.Extensions.ZoreEntity/ZoreDbContext.SelectImpl.cs +++ b/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.SelectImpl.cs @@ -10,15 +10,15 @@ using System.Text; using T = System.Collections.Generic.Dictionary; -namespace FreeSql.Extensions.ZoreEntity +namespace FreeSql.Extensions.ZeroEntity { - partial class ZoreDbContext + partial class ZeroDbContext { public class SelectImpl { - ZoreDbContext _dbcontext; + ZeroDbContext _dbcontext; IFreeSql _orm => _dbcontext._orm; - List _tables => _dbcontext._tables; + List _tables => _dbcontext._tables; int _mainTableIndex = -1; List _tableAlias; ISelect _select; @@ -33,7 +33,7 @@ public class SelectImpl bool _includeAll = false; SelectImpl() { } - internal SelectImpl(ZoreDbContext dbcontext, string tableName) + internal SelectImpl(ZeroDbContext dbcontext, string tableName) { _dbcontext = dbcontext; var tableIndex = _tables.FindIndex(a => a.CsName.ToLower() == tableName?.ToLower()); @@ -61,7 +61,7 @@ public SelectImpl IncludeAll() LocalAutoInclude(_tables[_mainTableIndex], "a"); return this; - void LocalAutoInclude(ZoreTableInfo table, string alias, string navPath = "") + void LocalAutoInclude(ZeroTableInfo table, string alias, string navPath = "") { if (ignores.ContainsKey(table.CsName)) return; ignores.Add(table.CsName, true); @@ -179,7 +179,7 @@ SelectImpl Join(string joinType, string tableName, params string[] onFields) class TableAliasInfo { public string Alias { get; set; } - public ZoreTableInfo Table { get; set; } + public ZeroTableInfo Table { get; set; } public string[] NavPath { get; set; } public List>> IncludeMany { get; set; } = new List>>(); } @@ -200,7 +200,7 @@ string GetMaxAlias() return alias; } } - TableAliasInfo FlagFetchResult(ZoreTableInfo table, string alias, string navPath) + TableAliasInfo FlagFetchResult(ZeroTableInfo table, string alias, string navPath) { var tableAlias = _tableAlias.Where(a => a.Alias == alias).FirstOrDefault(); if (tableAlias == null) @@ -533,7 +533,7 @@ public SelectImpl ForUpdate(bool nowait = false) return this; } - NativeTuple ParseField(ZoreTableInfo firstTable, string firstTableAlias, string property) + NativeTuple ParseField(ZeroTableInfo firstTable, string firstTableAlias, string property) { if (string.IsNullOrEmpty(property)) return null; var field = property.Split('.').Select(a => a.Trim()).ToArray(); diff --git a/Extensions/FreeSql.Extensions.ZoreEntity/ZoreDbContext.cs b/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.cs similarity index 96% rename from Extensions/FreeSql.Extensions.ZoreEntity/ZoreDbContext.cs rename to Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.cs index 402dfda30..3c6e759a0 100644 --- a/Extensions/FreeSql.Extensions.ZoreEntity/ZoreDbContext.cs +++ b/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.cs @@ -11,7 +11,7 @@ using System.Reflection; using T = System.Collections.Generic.Dictionary; -namespace FreeSql.Extensions.ZoreEntity +namespace FreeSql.Extensions.ZeroEntity { /* @@ -58,13 +58,13 @@ OneToMany 级联删除 ManyToOne 忽略 ManyToMany 级联删除中间表(注意不删除外部根) */ - public partial class ZoreDbContext + public partial class ZeroDbContext { internal IFreeSql _orm; internal DbTransaction _transaction; internal int _commandTimeout; - internal List _tables; - public ZoreDbContext(IFreeSql orm, TableDescriptor[] schemas) + internal List _tables; + public ZeroDbContext(IFreeSql orm, TableDescriptor[] schemas) { _orm = orm; _tables = VilidateSchemaToInfo(orm, schemas); @@ -80,10 +80,10 @@ public void SyncStructure(string name) _orm.CodeFirst.SyncStructure(table, table.DbName, false); } - static List VilidateSchemaToInfo(IFreeSql orm, IEnumerable schemas) + static List VilidateSchemaToInfo(IFreeSql orm, IEnumerable schemas) { var common = (orm.Ado as AdoProvider)._util; - var tables = new List(); + var tables = new List(); foreach (var dtd in schemas) { if (string.IsNullOrWhiteSpace(dtd.Name)) continue; @@ -97,7 +97,7 @@ static List VilidateSchemaToInfo(IFreeSql orm, IEnumerable VilidateSchemaToInfo(IFreeSql orm, IEnumerable a.CsName == dtdnav.RelTable).FirstOrDefault(); @@ -210,12 +210,12 @@ static List VilidateSchemaToInfo(IFreeSql orm, IEnumerable entities) + void AuditCascade(ZeroTableInfo entityTable, IEnumerable entities) { if (entities == null) return; foreach (var entity in entities) AuditCascade(entityTable, entity); } - internal void AuditCascade(ZoreTableInfo entityTable, T entity) + internal void AuditCascade(ZeroTableInfo entityTable, T entity) { var ignores = new Dictionary>(); //比如 Tree 结构可以递归添加 LocalAuditCascade(entityTable, entity); ignores.Clear(); - void LocalAuditCascade(ZoreTableInfo table, T entityFrom) + void LocalAuditCascade(ZeroTableInfo table, T entityFrom) { if (entityFrom == null) return; @@ -550,7 +550,7 @@ bool CanCascade(TableInfo entityTable, T entity, bool isadd) } return false; } - void InsertCascade(ZoreTableInfo entityTable, IEnumerable entities, bool cascade) + void InsertCascade(ZeroTableInfo entityTable, IEnumerable entities, bool cascade) { var navs = entityTable.Navigates.OrderBy(a => a.Value.RefType).ThenBy(a => a.Key).ToArray(); SaveOutsideCascade(entities, navs); @@ -791,7 +791,7 @@ bool LocalCanAdd(TableInfo table, T data, bool isThrow) #endregion } - void SaveOutsideCascade(IEnumerable entities, IEnumerable> navs) + void SaveOutsideCascade(IEnumerable entities, IEnumerable> navs) { foreach (var nav in navs) { @@ -829,7 +829,7 @@ void SaveOutsideCascade(IEnumerable entities, IEnumerable> outsideData) + void SaveOutsideCascade(ZeroTableInfo entityTable, ZeroTableRef nav, IEnumerable> outsideData) { outsideData = outsideData.Where(a => CanCascade(entityTable, a.Item2, true)).ToList(); if (outsideData.Any() == false) return; @@ -861,20 +861,20 @@ void SaveOutsideCascade(ZoreTableInfo entityTable, ZoreTableRef nav, IEnumerable } } - void UpdateCascade(ZoreTableInfo entityTable, IEnumerable entities, bool cascade) + void UpdateCascade(ZeroTableInfo entityTable, IEnumerable entities, bool cascade) { SaveOutsideCascade(entities, entityTable.Navigates.OrderBy(a => a.Value.RefType).ThenBy(a => a.Key)); var tracking = new TrackingChangeInfo(); foreach (var entity in entities) { var stateKey = GetEntityKeyString(entityTable, entity); - if (_states.TryGetValue(entityTable.DbName, out var kv) == false || kv.TryGetValue(stateKey, out var state) == false) throw new Exception($"{nameof(ZoreDbContext)} 查询之后,才可以更新数据 {GetEntityString(entityTable, entity)}"); + if (_states.TryGetValue(entityTable.DbName, out var kv) == false || kv.TryGetValue(stateKey, out var state) == false) throw new Exception($"{nameof(ZeroDbContext)} 查询之后,才可以更新数据 {GetEntityString(entityTable, entity)}"); CompareEntityValue(entityTable, state.Value, entity, tracking); } SaveTrackingChange(tracking); foreach (var entity in entities) AttachCascade(entityTable, entity, false); } - void DeleteCascade(ZoreTableInfo entityTable, IEnumerable entities, List deletedOutput) + void DeleteCascade(ZeroTableInfo entityTable, IEnumerable entities, List deletedOutput) { var tracking = new TrackingChangeInfo(); foreach (var entity in entities) @@ -946,13 +946,13 @@ void SaveTrackingChange(TrackingChangeInfo tracking) } #region EntityState - internal void AttachCascade(ZoreTableInfo entityTable, T entity, bool includeOutside) + internal void AttachCascade(ZeroTableInfo entityTable, T entity, bool includeOutside) { var ignores = new Dictionary>(); //比如 Tree 结构可以递归添加 LocalAttachCascade(entityTable, entity, true); ignores.Clear(); - void LocalAttachCascade(ZoreTableInfo table, T entityFrom, bool flag) + void LocalAttachCascade(ZeroTableInfo table, T entityFrom, bool flag) { if (flag == false) return; if (entityFrom == null) return; @@ -967,7 +967,7 @@ void LocalAttachCascade(ZoreTableInfo table, T entityFrom, bool flag) if (kv.ContainsKey(state.Key)) kv[state.Key] = state; else kv.Add(state.Key, state); } - bool LocalMapEntityValue(ZoreTableInfo table, T entityFrom, T entityTo) + bool LocalMapEntityValue(ZeroTableInfo table, T entityFrom, T entityTo) { if (entityFrom == null || entityTo == null) return true; @@ -1081,7 +1081,7 @@ public EntityState(T value, string key) public DateTime Time { get; set; } } Dictionary> _states = new Dictionary>(); - bool? ExistsInStates(ZoreTableInfo table, T data) + bool? ExistsInStates(ZeroTableInfo table, T data) { if (data == null) throw new ArgumentNullException(nameof(data)); var key = GetEntityKeyString(table, data); @@ -1131,17 +1131,17 @@ string GetEntityKeyString(TableInfo table, T data, bool genGuid = false) class TrackingChangeInfo { - public List> InsertLog { get; } = new List>(); - public List>> UpdateLog { get; } = new List>>(); - public List> DeleteLog { get; } = new List>(); + public List> InsertLog { get; } = new List>(); + public List>> UpdateLog { get; } = new List>>(); + public List> DeleteLog { get; } = new List>(); } - void CompareEntityValue(ZoreTableInfo rootTable, T rootEntityBefore, T rootEntityAfter, TrackingChangeInfo tracking) + void CompareEntityValue(ZeroTableInfo rootTable, T rootEntityBefore, T rootEntityAfter, TrackingChangeInfo tracking) { var rootIgnores = new Dictionary>(); //比如 Tree 结构可以递归添加 LocalCompareEntityValue(rootTable, rootEntityBefore, rootEntityAfter, true); rootIgnores.Clear(); - void LocalCompareEntityValue(ZoreTableInfo table, T entityBefore, T entityAfter, bool cascade) + void LocalCompareEntityValue(ZeroTableInfo table, T entityBefore, T entityAfter, bool cascade) { if (entityBefore != null) { @@ -1211,7 +1211,7 @@ void LocalCompareEntityValue(ZoreTableInfo table, T entityBefore, T entityAfter, } } } - void LocalCompareEntityValueCollection(ZoreTableInfo elementTable, IEnumerable collectionBefore, IEnumerable collectionAfter, bool cascade) + void LocalCompareEntityValueCollection(ZeroTableInfo elementTable, IEnumerable collectionBefore, IEnumerable collectionAfter, bool cascade) { if (collectionBefore == null && collectionAfter == null) return; if (collectionBefore == null && collectionAfter != null) @@ -1271,7 +1271,7 @@ void LocalCompareEntityValueCollection(ZoreTableInfo elementTable, IEnumerable c foreach (var key in dictBefore.Keys) LocalCompareEntityValue(elementTable, dictBefore[key], dictAfter.TryGetValue(key, out var afterItem) ? afterItem : null, cascade); } - void NavigateReader(ZoreTableInfo readerTable, T readerEntity, Action> callback) + void NavigateReader(ZeroTableInfo readerTable, T readerEntity, Action> callback) { var ignores = new Dictionary>(); //比如 Tree 结构可以递归添加 var statckPath = new Stack(); @@ -1281,7 +1281,7 @@ void NavigateReader(ZoreTableInfo readerTable, T readerEntity, Action GetManyToManyObjects(ZoreTableRef nav, T entity, string navName) + List GetManyToManyObjects(ZeroTableRef nav, T entity, string navName) { if (nav.RefType != TableRefType.ManyToMany) return null; if (entity.TryGetValue(navName, out var rightsObj) == false || rightsObj is IEnumerable rights == false || rights == null) return null; @@ -1442,7 +1442,7 @@ List GetManyToManyObjects(ZoreTableRef nav, T entity, string navName) } return middles; } - void SetNavigateRelationshipValue(ZoreTableRef nav, T leftItem, object rightItem) + void SetNavigateRelationshipValue(ZeroTableRef nav, T leftItem, object rightItem) { switch (nav.RefType) { diff --git a/Extensions/FreeSql.Extensions.ZoreEntity/ZoreDescriptor.cs b/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDescriptor.cs similarity index 89% rename from Extensions/FreeSql.Extensions.ZoreEntity/ZoreDescriptor.cs rename to Extensions/FreeSql.Extensions.ZeroEntity/ZeroDescriptor.cs index 9fec513e2..90889fbb8 100644 --- a/Extensions/FreeSql.Extensions.ZoreEntity/ZoreDescriptor.cs +++ b/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDescriptor.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -namespace FreeSql.Extensions.ZoreEntity +namespace FreeSql.Extensions.ZeroEntity { public class TableDescriptor { @@ -78,20 +78,20 @@ public enum NavigateType } - class ZoreTableRef + class ZeroTableRef { internal string NavigateKey { get; set; } public TableRefType RefType { get; set; } - internal ZoreTableInfo Table { get; set; } - internal ZoreTableInfo RefTable { get; set; } - internal ZoreTableInfo RefMiddleTable { get; set; } + internal ZeroTableInfo Table { get; set; } + internal ZeroTableInfo RefTable { get; set; } + internal ZeroTableInfo RefMiddleTable { get; set; } public List Columns { get; set; } = new List(); public List MiddleColumns { get; set; } = new List(); public List RefColumns { get; set; } = new List(); } - class ZoreTableInfo : TableInfo + class ZeroTableInfo : TableInfo { - public Dictionary Navigates { get; set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); + public Dictionary Navigates { get; set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); } } diff --git a/Extensions/FreeSql.Extensions.ZoreEntity/key.snk b/Extensions/FreeSql.Extensions.ZeroEntity/key.snk similarity index 100% rename from Extensions/FreeSql.Extensions.ZoreEntity/key.snk rename to Extensions/FreeSql.Extensions.ZeroEntity/key.snk diff --git a/FreeSql-ZoreEntity.sln b/FreeSql-ZeroEntity.sln similarity index 94% rename from FreeSql-ZoreEntity.sln rename to FreeSql-ZeroEntity.sln index ee6bafda7..717e96669 100644 --- a/FreeSql-ZoreEntity.sln +++ b/FreeSql-ZeroEntity.sln @@ -5,7 +5,7 @@ VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql", "FreeSql\FreeSql.csproj", "{3AAE17E8-8608-4905-826A-6DB68F75F339}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.ZoreEntity", "Extensions\FreeSql.Extensions.ZoreEntity\FreeSql.Extensions.ZoreEntity.csproj", "{E0480E6F-CFCD-4108-969C-448E44023C97}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.ZeroEntity", "Extensions\FreeSql.Extensions.ZeroEntity\FreeSql.Extensions.ZeroEntity.csproj", "{E0480E6F-CFCD-4108-969C-448E44023C97}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Sqlite", "Providers\FreeSql.Provider.Sqlite\FreeSql.Provider.Sqlite.csproj", "{5E4928F2-E52B-4563-9FF7-C0A4119E6596}" EndProject diff --git a/FreeSql-lite.sln b/FreeSql-lite.sln index b19aedbc5..60677b033 100644 --- a/FreeSql-lite.sln +++ b/FreeSql-lite.sln @@ -89,7 +89,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.QuestDb", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Xugu", "Providers\FreeSql.Provider.Xugu\FreeSql.Provider.Xugu.csproj", "{353F3732-0704-40F2-972B-036E9CC01881}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.ZoreEntity", "Extensions\FreeSql.Extensions.ZoreEntity\FreeSql.Extensions.ZoreEntity.csproj", "{4367B7AC-604F-4503-A1D4-643ADBFCF703}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.ZeroEntity", "Extensions\FreeSql.Extensions.ZeroEntity\FreeSql.Extensions.ZeroEntity.csproj", "{4367B7AC-604F-4503-A1D4-643ADBFCF703}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/FreeSql.sln b/FreeSql.sln index af103bd23..d6fbdbbba 100644 --- a/FreeSql.sln +++ b/FreeSql.sln @@ -125,7 +125,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Xugu", "Pr EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.Xugu", "FreeSql.Tests\FreeSql.Tests.Provider.Xugu\FreeSql.Tests.Provider.Xugu.csproj", "{16C21D77-20AC-4722-AD97-F53BDDE8210C}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.ZoreEntity", "Extensions\FreeSql.Extensions.ZoreEntity\FreeSql.Extensions.ZoreEntity.csproj", "{D9419896-BFB0-47C1-BEFD-A6C48394643B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.ZeroEntity", "Extensions\FreeSql.Extensions.ZeroEntity\FreeSql.Extensions.ZeroEntity.csproj", "{D9419896-BFB0-47C1-BEFD-A6C48394643B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution