Overriding code-generated DbContext constructor

前端 未结 5 1352
花落未央
花落未央 2021-01-11 14:57

I\'m sure I\'ve done this before at some stage, but I can\'t figure out how to now! My scenario:

// This is generated from EDMX
public partial class HOLDbEnt         


        
5条回答
  •  猫巷女王i
    2021-01-11 15:18

    Here is my solution to the problem. I edit the TT file as Dylan Hayes suggested and replaced the constructor with my own. In my case, i needed to change the schema names of certain schemas only. I set a variable in the config file to tell me what environment I was in and used the right schema.

    using System.Configuration;
    using System.Data.Entity;
    using System.Data.Entity.Core.Mapping;
    using System.Data.Entity.Core.Metadata.Edm;
    using System.Data.Entity.Core.Objects;
    using System.Data.Entity.Infrastructure;
    using System.Reflection;
    using System.Xml;
    
    namespace WS.Framework.WSJDEData
    {
    
        public partial class WSJDE : DbContext
        {
            public WSJDE()
                : base("name=WSJDE")
            {
                ObjectContext context = (this as IObjectContextAdapter).ObjectContext;
    
                string environment = ConfigurationManager.AppSettings.Get("Environment");
    
                const string devCTL = "TESTCTL";
                const string devDTA = "TESTDTA";
                const string qaCTL = "CRPCTL";
                const string qaDTA = "CRPDTA";
                const string prodCTL = "PRODCTL";
                const string prodDTA = "PRODDTA";
    
                var x = Assembly.GetExecutingAssembly().GetManifestResourceStream("WSJDEData.WSJDE.ssdl");
    
                XmlReader[] sReaders = new XmlReader[]
                    {
                        XmlReader.Create(Assembly.GetExecutingAssembly().GetManifestResourceStream("WSJDEData.WSJDE.ssdl"))
                    };
    
                XmlReader[] mReaders = new XmlReader[]
                    {XmlReader.Create(Assembly.GetExecutingAssembly().GetManifestResourceStream("WSJDEData.WSJDE.msl"))};
    
                StoreItemCollection sCollection = new StoreItemCollection(sReaders);
    
                ObjectContext objContext = ((IObjectContextAdapter) context).ObjectContext;
                MetadataWorkspace workspace = objContext.MetadataWorkspace;
    
                EdmItemCollection cCollection = workspace.GetItemCollection(DataSpace.CSpace) as EdmItemCollection;
    
    
                StorageMappingItemCollection csCollection = new StorageMappingItemCollection(cCollection, sCollection,
                                                                                             mReaders);
    
                workspace.RegisterItemCollection(sCollection);
                workspace.RegisterItemCollection(csCollection);
    
                EntityContainer container = workspace.GetItem("WSJDEModelStoreContainer", DataSpace.SSpace);
    
                foreach (EntitySetBase entitySetBase in container.BaseEntitySets)
                {
                    string schema = entitySetBase.Schema;
    
                    if (schema != null)
                    {
                        string name = schema.Substring(schema.Length - 3);
    
                        if (name == "CTL")
                        {
                            switch (environment)
                            {
                                case "Dev":
                                    typeof (EntitySetBase).GetField("_schema",
                                                                    BindingFlags.NonPublic | BindingFlags.Instance)
                                                          .SetValue(entitySetBase, devCTL);
                                    break;
                                case "QA":
                                    typeof (EntitySetBase).GetField("_schema",
                                                                    BindingFlags.NonPublic | BindingFlags.Instance)
                                                          .SetValue(entitySetBase, qaCTL);
                                    break;
                                case "Prod":
                                    typeof (EntitySetBase).GetField("_schema",
                                                                    BindingFlags.NonPublic | BindingFlags.Instance)
                                                          .SetValue(entitySetBase, prodCTL);
                                    break;
    
                            }
                        }
    
                        if (name == "DTA")
                        {
                            switch (environment)
                            {
                                case "Dev":
                                    typeof (EntitySetBase).GetField("_schema",
                                                                    BindingFlags.NonPublic | BindingFlags.Instance)
                                                          .SetValue(entitySetBase, devDTA);
                                    break;
                                case "QA":
                                    typeof (EntitySetBase).GetField("_schema",
                                                                    BindingFlags.NonPublic | BindingFlags.Instance)
                                                          .SetValue(entitySetBase, qaDTA);
                                    break;
                                case "Prod":
                                    typeof (EntitySetBase).GetField("_schema",
                                                                    BindingFlags.NonPublic | BindingFlags.Instance)
                                                          .SetValue(entitySetBase, prodDTA);
                                    break;
    
                            }
                        }
                    }
                }
            }
        }
    }
    

提交回复
热议问题