コード例 #1
0
        public CodeContextEntityWraperMember(WXMLCodeDomGeneratorSettings settings, EntityDefinition entity)
        {
            _settings = settings;
            m_entity  = entity;
            string entityName = entity.Name;

            if (entityName.EndsWith("s"))
            {
                entityName += "es";
            }
            else if (entityName.EndsWith("y"))
            {
                entityName += "ies";
            }
            else
            {
                entityName += "s";
            }
            Attributes = MemberAttributes.Public | MemberAttributes.Final;
            Name       = (entity.EntitySpecificNamespace ?? string.Empty) + entityName;
            var entityTypeReference = new CodeTypeReference(new WXMLCodeDomGeneratorNameHelper(_settings).GetEntityClassName(Entity, true));

            Type = new CodeTypeReference("Worm.Linq.QueryWrapperT", entityTypeReference);
            SetStatements.Clear();
            GetStatements.Add(
                new CodeMethodReturnStatement(
                    new CodeMethodInvokeExpression(
                        new CodeMethodReferenceExpression(
                            new CodeThisReferenceExpression(), "CreateQueryWrapper", entityTypeReference)
                        )
                    )
                );
        }
コード例 #2
0
 public CodeEntityTypeDeclaration(WXMLCodeDomGeneratorSettings settings, EntityDefinition entity, WormCodeDomGenerator gen)
     : this(settings, gen)
 {
     Entity = entity;
     m_typeReference.BaseType        = FullName;
     entity.Items["TypeDeclaration"] = this;
 }
コード例 #3
0
 public CodePropertiesAccessorTypeDeclaration(WXMLCodeDomGeneratorSettings settings, EntityDefinition entity, PropertyGroup group)
 {
     Entity           = entity;
     Group            = group;
     IsClass          = true;
     Name             = group.Name + "Accessor";
     PopulateMembers += OnPopulateMemebers;
     _settings        = settings;
 }
コード例 #4
0
 public CodeEntityTypeDeclaration(WXMLCodeDomGeneratorSettings settings, WormCodeDomGenerator gen)
 {
     m_typeReference      = new CodeTypeReference();
     m_propertiesAccessor = new Dictionary <string, CodePropertiesAccessorTypeDeclaration>();
     PopulateMembers     += OnPopulateMembers;
     //_useType = useType;
     _settings = settings;
     _gen      = gen;
 }
コード例 #5
0
        public Enumer(WXMLModel model, string ext)
        {
            _model = model;

            //Create the CodeCompileUnit from the passed-in XML file
            WXMLCodeDomGeneratorSettings settings = new WXMLCodeDomGeneratorSettings();

            settings.EntitySchemaDefClassNameSuffix = "SchemaDef";
            LinqToCodedom.CodeDomGenerator.Language language;
            switch (ext)
            {
            case ".cs":
                settings.LanguageSpecificHacks = LanguageSpecificHacks.CSharp;
                language = LinqToCodedom.CodeDomGenerator.Language.CSharp;
                break;

            case ".vb":
                settings.LanguageSpecificHacks = LanguageSpecificHacks.VisualBasic;
                language = LinqToCodedom.CodeDomGenerator.Language.VB;
                break;

            default:
                throw new NotSupportedException(ext);
                //case ".js":
                //    settings.LanguageSpecificHacks = LanguageSpecificHacks.VisualBasic;
                //    break;
            }
            settings.PrivateMembersPrefix = "m_";
            //settings.Split = false;

            //ormObjectsDef.GenerateSchemaOnly
            WormCodeDomGenerator generator = new WormCodeDomGenerator(model, settings);

            if (model.GenerateSingleFile)
            {
                CodeCompileFileUnit compileUnit = generator.GetFullSingleUnit(language);
                _units = new List <Pair>()
                {
                    new Pair()
                    {
                        Unit = compileUnit
                    }
                };
            }
            else
            {
                _units = new List <Pair>();
                foreach (var entity in model.GetActiveEntities())
                {
                    _units.Add(new Pair()
                    {
                        Unit = generator.GetEntityCompileUnits(entity.Identifier, language)[0]
                    });
                }
            }
        }
コード例 #6
0
        public CodeEntityInterfaceDeclaration(WXMLCodeDomGeneratorSettings settings, CodeEntityTypeDeclaration entityTypeDeclaration, string prefix, string suffix)
            : this(settings)
        {
            NamePrefix = prefix;
            NameSuffix = suffix;

            EntityTypeDeclaration = entityTypeDeclaration;

            m_typeReference.BaseType = FullName;
        }
コード例 #7
0
 public string GetTypeName(WXMLCodeDomGeneratorSettings settings)
 {
     if (IsClrType)
     {
         return(_clrType.FullName);
     }
     if (IsUserType)
     {
         return(_userType);
     }
     return(new WXMLCodeDomGeneratorNameHelper(settings).GetEntityClassName(_entity, true));
 }
コード例 #8
0
        public CodeLinqContextDeclaration(WXMLCodeDomGeneratorSettings settings, LinqSettingsDescriptor linqSettings)
        {
            _settings          = settings;
            PopulateMembers   += OnPopulateMembers;
            PopulateBaseTypes += OnPopulateBaseTypes;
            LinqSettings       = linqSettings;
            if (ContextClassBehaviour == ContextClassBehaviourType.PartialClass || ContextClassBehaviour == ContextClassBehaviourType.BasePartialClass)
            {
                IsPartial = true;
            }

            Name = !String.IsNullOrEmpty(LinqSettings.ContextName) ? LinqSettings.ContextName : "LinqContext";
        }
コード例 #9
0
ファイル: TestCodeGen.cs プロジェクト: AlexeyShirshov/om-ml2
        public static void TestCSCodeInternal(Stream stream, WXMLCodeDomGeneratorSettings settings)
        {
            CodeDomProvider prov = new Microsoft.CSharp.CSharpCodeProvider();

            settings.LanguageSpecificHacks = LanguageSpecificHacks.CSharp;
            //settings.RemoveOldM2M = true;
            //settings.Split = false;
            CompileCode(prov, settings, XmlReader.Create(stream));

            //stream.Position = 0;

            //settings.Split = true;
            //CompileCode(prov, settings, XmlReader.Create(stream));
        }
コード例 #10
0
        public CodeEntityInterfaceDeclaration(WXMLCodeDomGeneratorSettings settings)
        {
            m_typeReference = new CodeTypeReference();

            IsClass     = false;
            IsPartial   = false;
            IsInterface = true;
            _settings   = settings;

            if ((settings.LanguageSpecificHacks & LanguageSpecificHacks.AllowPartialInterfaces) == LanguageSpecificHacks.AllowPartialInterfaces)
            {
                IsPartial = true;
            }
        }
コード例 #11
0
ファイル: TestCodeGen.cs プロジェクト: AlexeyShirshov/om-ml2
        public Assembly TestVBCodeInternal(WXMLModel model, WXMLCodeDomGeneratorSettings settings,
                                           params CodeCompileUnit[] units)
        {
            //var providerOptions = new Dictionary<string, string> { { "CompilerVersion", "v3.5" } };
            //var providerOptions = new Dictionary<string, string> { { "CompilerVersion", "v4.0" } };
            CodeDomProvider prov = new Microsoft.VisualBasic.VBCodeProvider();

            settings.LanguageSpecificHacks = LanguageSpecificHacks.VisualBasic;
            //settings.RemoveOldM2M = true;

            //settings.Split = false;
            return(CompileCode(prov, true, settings, model, units));
            //stream.Position = 0;

            //settings.Split = true;
            //CompileCode(prov, settings, XmlReader.Create(stream));
        }
コード例 #12
0
        public CodeTypeReference ToCodeType(WXMLCodeDomGeneratorSettings settings)
        {
            if (_tr != null)
            {
                return(_tr);
            }

            TypeDefinition propertyTypeDesc = this;

            var t = new CodeTypeReference(propertyTypeDesc.IsEntityType
                  ? new WXMLCodeDomGeneratorNameHelper(settings).GetEntityClassName(propertyTypeDesc.Entity, true)
                  : propertyTypeDesc.GetTypeName(settings));

            //if (IsUserType && (UserTypeHint & UserTypeHintFlags.Interface) == UserTypeHintFlags.Interface)
            //    t.Is

            return(t);
        }
コード例 #13
0
ファイル: TestCodeGen.cs プロジェクト: AlexeyShirshov/om-ml2
        private static Assembly CompileCode(CodeDomProvider prov, bool v35, WXMLCodeDomGeneratorSettings settings,
                                            WXMLModel model, params CodeCompileUnit[] units)
        {
            WormCodeDomGenerator gen = new WormCodeDomGenerator(model, settings);
            CompilerResults      result;
            CompilerParameters   prms = new CompilerParameters
            {
                GenerateExecutable      = false,
                GenerateInMemory        = true,
                IncludeDebugInformation = false,
                TreatWarningsAsErrors   = false/*,
                                                * OutputAssembly = "testAssembly.dll"*/
            };

            prms.ReferencedAssemblies.Add("System.dll");
            prms.ReferencedAssemblies.Add("System.Data.dll");
            prms.ReferencedAssemblies.Add("System.XML.dll");
            if (v35)
            {
                prms.ReferencedAssemblies.Add("System.Core.dll");
            }
            if ((settings.GenerateMode.HasValue ? settings.GenerateMode.Value : model.GenerateMode) != GenerateModeEnum.EntityOnly)
            {
                //prms.ReferencedAssemblies.Add("CoreFramework.dll");
                prms.ReferencedAssemblies.Add("Worm.Orm.dll");
                if (model.LinqSettings != null && model.LinqSettings.Enable)
                {
                    prms.ReferencedAssemblies.Add("Worm.Linq.dll");
                }
            }

            prms.TempFiles.KeepFiles = true;

            CodeCompileUnit singleUnit = new CodeCompileUnit();

            if (settings.SingleFile.HasValue ? settings.SingleFile.Value : model.GenerateSingleFile)
            {
                singleUnit = gen.GetFullSingleUnit(typeof(Microsoft.VisualBasic.VBCodeProvider).IsAssignableFrom(prov.GetType()) ? LinqToCodedom.CodeDomGenerator.Language.VB : LinqToCodedom.CodeDomGenerator.Language.CSharp);
                singleUnit.Namespaces.Add(new CodeNamespace("System"));
                singleUnit.Namespaces.Add(new CodeNamespace("System.Data"));
                singleUnit.Namespaces.Add(new CodeNamespace("System.Data.Linq"));
                singleUnit.Namespaces.Add(new CodeNamespace("System.Linq"));
                singleUnit.Namespaces.Add(new CodeNamespace("System.Linq.Expressions"));
                singleUnit.Namespaces.Add(new CodeNamespace("System.Collections.Generic"));
                var l = new List <CodeCompileUnit>();
                l.Add(singleUnit);
                if (units != null)
                {
                    l.AddRange(units);
                    foreach (var item in units)
                    {
                        singleUnit.Namespaces.AddRange(item.Namespaces);
                    }
                }
                result = prov.CompileAssemblyFromDom(prms, l.ToArray());
            }
            else
            {
                Dictionary <string, CodeCompileFileUnit> dic =
                    gen.GetCompileUnits(typeof(Microsoft.VisualBasic.VBCodeProvider).IsAssignableFrom(prov.GetType()) ? LinqToCodedom.CodeDomGenerator.Language.VB : LinqToCodedom.CodeDomGenerator.Language.CSharp);

                foreach (CodeCompileFileUnit unit in dic.Values)
                {
                    singleUnit.Namespaces.AddRange(unit.Namespaces);
                }
                var l = new List <CodeCompileUnit>(dic.Values.OfType <CodeCompileUnit>());
                if (units != null)
                {
                    l.AddRange(units);
                    foreach (var item in units)
                    {
                        singleUnit.Namespaces.AddRange(item.Namespaces);
                    }
                }

                singleUnit.Namespaces.Add(new CodeNamespace("System"));
                singleUnit.Namespaces.Add(new CodeNamespace("System.Data"));
                singleUnit.Namespaces.Add(new CodeNamespace("System.Data.Linq"));
                singleUnit.Namespaces.Add(new CodeNamespace("System.Linq"));
                singleUnit.Namespaces.Add(new CodeNamespace("System.Linq.Expressions"));
                singleUnit.Namespaces.Add(new CodeNamespace("System.Collections.Generic"));

                result = prov.CompileAssemblyFromDom(prms, l.ToArray());
            }

            prov.GenerateCodeFromCompileUnit(singleUnit, Console.Out, new CodeGeneratorOptions());

            if (result.Errors.HasErrors)
            {
                StringBuilder sb = new StringBuilder();
                foreach (CompilerError str in result.Errors)
                {
                    sb.AppendLine(str.ToString());
                }
                Assert.Fail(sb.ToString());
            }

            return(result.CompiledAssembly);
        }
コード例 #14
0
ファイル: TestCodeGen.cs プロジェクト: AlexeyShirshov/om-ml2
 private static void CompileCode(CodeDomProvider prov, WXMLCodeDomGeneratorSettings settings,
                                 XmlReader reader)
 {
     CompileCode(prov, true, settings, WXMLModel.LoadFromXml(reader, new TestXmlUrlResolver()));
 }
コード例 #15
0
        static void Main(string[] args)
        {
            Console.WriteLine("Worm code generator utility.");
            Console.WriteLine();

            CommandLine.Utility.Arguments cmdLine = new CommandLine.Utility.Arguments(args);

            string          outputLanguage;
            string          outputFolder;
            WXMLModel       model;
            string          inputFilename;
            CodeDomProvider codeDomProvider;
            bool            split, separateFolder;

            string[] skipEntities;
            string[] processEntities;
            WXMLCodeDomGeneratorSettings settings = new WXMLCodeDomGeneratorSettings();

            if (cmdLine["?"] != null || cmdLine["h"] != null || cmdLine["help"] != null || args == null || args.Length == 0)
            {
                Console.WriteLine("Command line parameters:");
                Console.WriteLine("  -f\t- source xml file");
                Console.WriteLine("  -v\t- validate input file against schema only");
                Console.WriteLine("  -t\t- test run (generate files in memory)");
                Console.WriteLine("  -l\t- code language [cs, vb] (\"cs\" by default)");
                //Console.WriteLine("  -p\t- generate partial classes (\"false\" by default)");
                Console.WriteLine("  -sp\t- split entity class and entity's schema definition\n\t\t  class code by diffrent files (\"false\" by default)");
                Console.WriteLine("  -sk\t- skip entities");
                Console.WriteLine("  -e\t- entities to process");
                //Console.WriteLine("  -cB\t- behaviour of class codegenerator\n\t\t  [Objects, PartialObjects] (\"Objects\" by default)");
                Console.WriteLine("  -sF\t- create folder for each entity.");
                Console.WriteLine("  -o\t- output files folder.");
                Console.WriteLine("  -pmp\t- private members prefix (\"_\" by default)");
                Console.WriteLine("  -cnP\t- class name prefix (null by default)");
                Console.WriteLine("  -cnS\t- class name suffix (null by default)");
                Console.WriteLine("  -fnP\t- file name prefix (null by default)");
                Console.WriteLine("  -fnS\t- file name suffix (null by default)");
                Console.WriteLine("  -propsT\t- use type instead of entity name in props (false by default)");
                //Console.WriteLine("  -rm\t- remove old m2m methods (false by default)");
                Console.WriteLine("  -of\t- generate one file (false by default)");
                //Console.WriteLine("  -so\t- generate entity schema only (false by default)");
                return;
            }

            if (cmdLine["f"] != null)
            {
                inputFilename = cmdLine["f"];
            }
            else
            {
                Console.WriteLine("Please give 'f' parameter");
                return;
            }

            bool validateOnly = (cmdLine["v"] != null);
            bool testRun      = (cmdLine["t"] != null);

            if (cmdLine["l"] != null)
            {
                outputLanguage = cmdLine["l"];
            }
            else
            {
                outputLanguage = "CS";
            }

            if (cmdLine["sF"] != null)
            {
                separateFolder = true;
            }
            else
            {
                separateFolder = false;
            }
            LanguageSpecificHacks languageHacks = LanguageSpecificHacks.None;

            if (outputLanguage.ToUpper() == "VB")
            {
                codeDomProvider = new VBCodeProvider();
                languageHacks   = LanguageSpecificHacks.VisualBasic;
            }
            else if (outputLanguage.ToUpper() == "CS")
            {
                codeDomProvider = new CSharpCodeProvider();
                languageHacks   = LanguageSpecificHacks.CSharp;
            }
            else
            {
                Console.WriteLine("Error: incorrect value in \"l\" parameter.");
                return;
            }

            if (cmdLine["sp"] != null)
            {
                split = true;
            }
            else
            {
                split = false;
            }


            if (cmdLine["o"] != null)
            {
                outputFolder = cmdLine["o"];
            }
            else
            {
                outputFolder = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
                if (string.IsNullOrEmpty(outputFolder))
                {
                    outputFolder = Path.GetPathRoot(System.Reflection.Assembly.GetExecutingAssembly().Location);
                }
            }

            if (cmdLine["sk"] != null)
            {
                skipEntities = cmdLine["sk"].Split(',');
            }
            else
            {
                skipEntities = new string[] { }
            };

            if (cmdLine["e"] != null)
            {
                processEntities = cmdLine["e"].Split(',');
            }
            else
            {
                processEntities = new string[] { }
            };

            if (cmdLine["pmp"] != null)
            {
                settings.PrivateMembersPrefix = cmdLine["pmp"];
            }

            if (cmdLine["fnP"] != null)
            {
                settings.FileNamePrefix = cmdLine["fnP"];
            }
            if (cmdLine["fnS"] != null)
            {
                settings.FileNameSuffix = cmdLine["fnS"];
            }

            if (cmdLine["cnP"] != null)
            {
                settings.ClassNamePrefix = cmdLine["cnP"];
            }
            if (cmdLine["cnS"] != null)
            {
                settings.ClassNameSuffix = cmdLine["cnS"];
            }

            if (cmdLine["propsT"] != null)
            {
                settings.UseTypeInProps = true;
            }

            //if (cmdLine["rm"] != null)
            //{
            //    settings.RemoveOldM2M = true;
            //}

            //if (cmdLine["os"] != null)
            //{
            //    settings.OnlySchema = true;
            //}

            bool oneFile = false;

            if (cmdLine["of"] != null)
            {
                oneFile = true;
            }

            if (!File.Exists(inputFilename))
            {
                Console.WriteLine("Error: source file {0} not found.", inputFilename);
                return;
            }

            //if (!System.IO.Directory.Exists(outputFolder))
            //{
            //    Console.WriteLine("Error: output folder not found.");
            //    return;
            //}
            if (string.IsNullOrEmpty(Path.GetDirectoryName(outputFolder)))
            {
                outputFolder = Path.GetPathRoot(outputFolder + Path.DirectorySeparatorChar.ToString());
            }
            else
            {
                outputFolder = Path.GetDirectoryName(outputFolder + Path.DirectorySeparatorChar.ToString());
            }

            try
            {
                Console.Write("Parsing file '{0}'...   ", inputFilename);
                using (XmlReader rdr = XmlReader.Create(inputFilename))
                {
                    model = WXMLModel.LoadFromXml(rdr, new XmlUrlResolver());
                }
                Console.WriteLine("done!");
                if (validateOnly)
                {
                    Console.WriteLine("Input file validation success.");
                    return;
                }
            }
            catch (Exception exc)
            {
                Console.WriteLine("error: {0}", exc.Message);
                Console.WriteLine("callstack: {0}", exc.StackTrace);
                if (exc.InnerException != null)
                {
                    Console.WriteLine("error: {0}", exc.InnerException.Message);
                }
                return;
            }

            if (!Directory.Exists(outputFolder))
            {
                try
                {
                    Directory.CreateDirectory(outputFolder);
                }
                catch (Exception)
                {
                }
            }

            var gen = new WXMLToWorm.WormCodeDomGenerator(model, settings);


            //settings.Split = split;
            settings.LanguageSpecificHacks = languageHacks;

            Console.WriteLine("Generation entities from file '{0}' using these settings:", inputFilename);
            Console.WriteLine("  Output folder: {0}", System.IO.Path.GetFullPath(outputFolder));
            Console.WriteLine("  Language: {0}", outputLanguage.ToLower());
            Console.WriteLine("  Split files: {0}", split);
            Console.WriteLine("  Skip entities: {0}", string.Join(" ", skipEntities));
            Console.WriteLine("  Process entities: {0}", string.Join(" ", processEntities));


            if (oneFile)
            {
                string privateFolder = outputFolder + Path.DirectorySeparatorChar.ToString();

                CodeCompileUnit unit = gen.GetFullSingleUnit(typeof(VBCodeProvider).IsAssignableFrom(codeDomProvider.GetType()) ? LinqToCodedom.CodeDomGenerator.Language.VB : LinqToCodedom.CodeDomGenerator.Language.CSharp);

                if (!Directory.Exists(privateFolder))
                {
                    Directory.CreateDirectory(privateFolder);
                }

                string outputFileName = Path.GetFullPath(privateFolder + Path.DirectorySeparatorChar.ToString() +
                                                         Path.GetFileNameWithoutExtension(inputFilename));

                GenerateCode(codeDomProvider, unit, outputFileName, testRun);

                Console.WriteLine();

                Console.WriteLine("Result:");

                Console.WriteLine("\t{0} single generated.");
            }
            else
            {
                GenerateMultipleFilesOutput(outputFolder, model, codeDomProvider, separateFolder,
                                            skipEntities, processEntities, testRun, gen);
            }
        }
コード例 #16
0
 public CodeEntityInterfaceDeclaration(WXMLCodeDomGeneratorSettings settings, CodeEntityTypeDeclaration entityTypeDeclaration)
     : this(settings, entityTypeDeclaration, null, null)
 {
 }
コード例 #17
0
 public CodeEntityPropertyField(WXMLCodeDomGeneratorSettings settings, ScalarPropertyDefinition property)
 {
     Type       = property.PropertyType.ToCodeType(settings);
     Name       = new WXMLCodeDomGeneratorNameHelper(settings).GetPrivateMemberName(property.Name);
     Attributes = WXMLCodeDomGenerator.GetMemberAttribute(property.FieldAccessLevel);
 }
コード例 #18
0
        private CodeCompileUnit GenerateModificationTracker(WXMLModel model, WXMLCodeDomGeneratorSettings setting)
        {
            var c = new CodeDomGenerator();

            string mtName = "LinqModificationTracker";

            var cls = c.AddNamespace(model.Namespace).AddClass(mtName);

            _ctxName = model.Namespace + "." + model.LinqSettings.ContextName;
            _mtName  = model.Namespace + "." + mtName;

            string conn = ConfigurationManager.ConnectionStrings["wms"].ConnectionString;

            cls.Implements(typeof(IModificationTracker))
            .AddEnum("ActionEnum")
            .AddFields(
                Define.StructField("Update"),
                Define.StructField("Insert"),
                Define.StructField("Delete")
                );

            cls.AddField("_changed", () => new List <object>());
            cls.AddField("_deleted", () => new List <object>());

            var tableType = new CodeTypeReference(typeof(System.Data.Linq.Table <>));

            tableType.TypeArguments.Add(new CodeTypeReference("T"));

            cls
            .AddMethod(MemberAttributes.Public | MemberAttributes.Final, (ParamArray <object> entities) => "Add",
                       Emit.stmt((List <object> _changed, object[] entities) => _changed.AddRange(entities)))
            .Implements(typeof(IModificationTracker))
            .AddMethod(MemberAttributes.Public | MemberAttributes.Final, (ParamArray <object> entities) => "Delete",
                       Emit.stmt((List <object> _deleted, object[] entities) => _deleted.AddRange(entities)))
            .Implements(typeof(IModificationTracker))
            .AddMethod(MemberAttributes.Public | MemberAttributes.Final, () => "AcceptModifications",
                       Emit.@using(new CodeTypeReference(_ctxName), "ctx", () => CodeDom.@new(_ctxName, conn),
                                   Emit.@foreach("entity", () => [email protected] <IEnumerable <object> >("_changed"),
                                                 Emit.stmt((object entity) => [email protected]("SyncEntity")(CodeDom.VarRef("ctx"), entity, false))
                                                 ),
                                   Emit.@foreach("entity", () => [email protected] <IEnumerable <object> >("_deleted"),
                                                 Emit.stmt((object entity) => [email protected]("SyncEntity")(CodeDom.VarRef("ctx"), entity, true))
                                                 ),
                                   Emit.stmt(() => CodeDom.VarRef("ctx").Call("SubmitChanges")),
                                   Emit.@foreach("entity", () => [email protected] <IEnumerable <object> >("_changed"),
                                                 Emit.stmt((object entity) => [email protected]("AcceptChanges")(entity))
                                                 ),
                                   Emit.stmt(() => [email protected] <List <object> >("_changed").Clear()),
                                   Emit.@foreach("entity", () => [email protected] <IEnumerable <object> >("_deleted"),
                                                 Emit.stmt((object entity) => [email protected]("AcceptChanges")(entity))
                                                 ),
                                   Emit.stmt(() => [email protected] <List <object> >("_deleted").Clear())
                                   )
                       ).Implements(typeof(IModificationTracker))
            .AddMethod(MemberAttributes.Private, () => "Dispose").Implements(typeof(IDisposable))
            .AddMethod(MemberAttributes.Private, (object entity) => "AcceptChanges",
                       Emit.declare("mi", (object entity) => entity.GetType().GetMethod("AcceptChanges")),
                       Emit.@if(() => CodeDom.VarRef("mi") != null,
                                Emit.stmt((MethodInfo mi, object entity) => mi.Invoke(entity, null))
                                )
                       )
            .AddMethod(MemberAttributes.Private, (DynType ctx, object entity, bool delete) => "SyncEntity" + ctx.SetType(_ctxName),
                       Emit.@foreach("mi", () => [email protected] <Type>("GetType")().GetMethods(BindingFlags.NonPublic | BindingFlags.Static),
                                     Emit.@if((bool delete, MethodInfo mi, object entity) =>
                                              ((delete && mi.Name == "_DelEntity") || (!delete && mi.Name == "_SyncEntity")) && mi.GetParameters().Count() == 2 && mi.GetParameters().Last().ParameterType == entity.GetType(),
                                              Emit.stmt((MethodInfo mi, object entity) => mi.Invoke(null, BindingFlags.Static, null, new object[] { CodeDom.VarRef("ctx"), entity }, null)),
                                              Emit.exitFor()
                                              )
                                     )
                       )
            .AddMethod(MemberAttributes.Private | MemberAttributes.Static, (DynType p, DynType action, DynType table) => "SyncEntity" + p.SetType("T") + action.SetType("ActionEnum") + table.SetType(tableType),
                       Emit.ifelse(() => CodeDom.VarRef("action") == CodeDom.Field(new CodeTypeReference("ActionEnum"), "Insert"),
                                   CodeDom.CombineStmts(Emit.stmt(() => CodeDom.VarRef("table").Call("InsertOnSubmit")(CodeDom.VarRef("p")))),
                                   Emit.ifelse(() => CodeDom.VarRef("action") == CodeDom.Field(new CodeTypeReference("ActionEnum"), "Delete"),
                                               CodeDom.CombineStmts(
                                                   Emit.stmt(() => CodeDom.VarRef("table").Call("Attach")(CodeDom.VarRef("p"))),
                                                   Emit.stmt(() => CodeDom.VarRef("table").Call("DeleteOnSubmit")(CodeDom.VarRef("p")))
                                                   ),
                                               Emit.stmt(() => CodeDom.VarRef("table").Call("Attach")(CodeDom.VarRef("p"), true))
                                               )
                                   )
                       ).Generic("T", typeof(object))
            ;

            WXMLCodeDomGeneratorNameHelper n = new WXMLCodeDomGeneratorNameHelper(setting);

            foreach (var entity in model.GetActiveEntities())
            {
                if (entity.GetPkProperties().Count() == 1)
                {
                    //string entityName = entity.Name;
                    string entityProp = WXMLCodeDomGeneratorNameHelper.GetMultipleForm(entity.Name);
                    string entityType = n.GetEntityClassName(entity, true);
                    string pkName     = entity.GetPkProperties().Single().Name;

                    cls.AddMethod(MemberAttributes.Static | MemberAttributes.Private,
                                  (DynType ctx, DynType p) => "_DelEntity" + ctx.SetType(_ctxName) + p.SetType(entityType),
                                  Emit.stmt(() => CodeDom.Call(null, "SyncEntity", new CodeTypeReference(entityType))(
                                                CodeDom.VarRef("p"),
                                                CodeDom.Field(new CodeTypeReference("ActionEnum"), "Delete"),
                                                CodeDom.VarRef("ctx").Property(entityProp))
                                            )
                                  )
                    .AddMethod(MemberAttributes.Static | MemberAttributes.Private,
                               (DynType ctx, DynType p) => "_SynEntity" + ctx.SetType(_ctxName) + p.SetType(entityType),
                               Emit.stmt(() => CodeDom.Call(null, "SyncEntity", new CodeTypeReference(entityType))(
                                             CodeDom.VarRef("p"),
                                             CodeDom.VarRef("p").Field <int>(pkName) == 0 ? CodeDom.Field(new CodeTypeReference("ActionEnum"), "Insert") : CodeDom.Field(new CodeTypeReference("ActionEnum"), "Update"),
                                             CodeDom.VarRef("ctx").Property(entityProp))
                                         )
                               )
                    ;
                }
            }

            string debug = c.GenerateCode(CodeDomGenerator.Language.CSharp);

            return(c.GetCompileUnit(CodeDomGenerator.Language.CSharp));
        }