diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/ICSharpCode.Data.addin b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/ICSharpCode.Data.addin index f149fca6d3..239735a9e2 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/ICSharpCode.Data.addin +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/ICSharpCode.Data.addin @@ -38,7 +38,7 @@ @@ -46,4 +46,11 @@ + + + + + diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/Templates/Files/CSharp.EDMX.xft b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/Templates/Files/CSharp.EDMX.xft index 2984065bbb..67f6a58cf4 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/Templates/Files/CSharp.EDMX.xft +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/Templates/Files/CSharp.EDMX.xft @@ -9,8 +9,26 @@ language = "C#" /> Entity Framework Data Model - - - + diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs index f8e8009371..5b58b0338c 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs @@ -20,12 +20,14 @@ using ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.CSDLType; using ICSharpCode.Data.EDMDesigner.Core.Windows.EDMWizard; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher; +using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common; #endregion namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding { - public class EDMDesignerViewContent : AbstractViewContent, IHasPropertyContainer, IToolsHost + public class EDMDesignerViewContent : AbstractViewContent, IHasPropertyContainer, IToolsHost, IEDMDesignerChangeWatcherObserver { #region Fields @@ -69,9 +71,9 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding } public DesignerCanvas DesignerCanvas - { + { get { return _designerCanvas; } - } + } #endregion @@ -83,7 +85,9 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding if (primaryFile == null) throw new ArgumentNullException("primaryFile"); - primaryFile.ForceInitializeView(this); // call Load() + primaryFile.ForceInitializeView(this); // call Load() + + EDMDesignerChangeWatcher.AddEDMDesignerViewContent(this); } #endregion @@ -94,6 +98,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding { Debug.Assert(file == this.PrimaryFile); + EDMDesignerChangeWatcher.Init = true; + // Load EDMX from stream XElement edmxElement = null; Action readMoreAction = edmxElt => edmxElement = edmxElt; @@ -114,15 +120,17 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding // Load or generate DesignerView and EntityTypeDesigners EntityTypeDesigner.Init = true; - if (edmxElement == null || edmxElement.Element("DesignerViews") == null) + XElement designerViewsElement = null; + + if (edmxElement == null || (designerViewsElement = EDMXIO.ReadSection(edmxElement, EDMXIO.EDMXSection.DesignerViews)) == null) { - edmxElement = new XElement("Designer", DesignerIO.GenerateNewDesignerViewsFromCSDLView(_edmView)); + designerViewsElement = DesignerIO.GenerateNewDesignerViewsFromCSDLView(_edmView); } - - if (edmxElement != null && edmxElement.Element("DesignerViews") != null) - DesignerIO.Read(_edmView, edmxElement.Element("DesignerViews"), entityType => new EntityTypeDesigner(entityType), complexType => new ComplexTypeDesigner(complexType)); - EntityTypeDesigner.Init = false; + if (edmxElement != null && designerViewsElement != null) + DesignerIO.Read(_edmView, designerViewsElement, entityType => new EntityTypeDesigner(entityType), complexType => new ComplexTypeDesigner(complexType)); + + EntityTypeDesigner.Init = false; // Call DoEvents, otherwise drawing associations can fail VisualHelper.DoEvents(); @@ -133,6 +141,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding // Register CSDL of EDMX in CSDL DatabaseTreeView CSDLDatabaseTreeViewAdditionalNode.Instance.CSDLViews.Add(_edmView.CSDL); + + EDMDesignerChangeWatcher.Init = false; } public override void Save(OpenedFile file, Stream stream) @@ -154,6 +164,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding { if (CSDLDatabaseTreeViewAdditionalNode.Instance.CSDLViews.Contains(_edmView.CSDL)) CSDLDatabaseTreeViewAdditionalNode.Instance.CSDLViews.Remove(_edmView.CSDL); + + EDMDesignerChangeWatcher.RemoveEDMDesignerViewContent(this); } public void ShowMappingTab(IUIType uiType) @@ -178,5 +190,26 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding } #endregion + + #region IEDMDesignerChangeWatcherObserver Member + + public bool ObjectChanged(object changedObject) + { + foreach (DesignerView designerView in _edmView.DesignerViews) + { + foreach (ITypeDesigner uiType in designerView) + { + if (uiType == changedObject || uiType.UIType.BusinessInstance == changedObject) + { + PrimaryFile.IsDirty = true; + return true; + } + } + } + + return false; + } + + #endregion } } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/CSDLType/TypeBaseDesigner.xaml.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/CSDLType/TypeBaseDesigner.xaml.cs index e622578b25..5fb78bc540 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/CSDLType/TypeBaseDesigner.xaml.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/CSDLType/TypeBaseDesigner.xaml.cs @@ -17,6 +17,7 @@ using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.CSDL.Type; using ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.Common; using ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.Relations; using ICSharpCode.Data.Core.UI; +using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher; #endregion @@ -285,6 +286,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.CSDLType set { entityTypeExpander.IsExpanded = value; + OnPropertyChanged("IsExpanded"); } } @@ -326,6 +328,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.CSDLType { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); + + EDMDesignerChangeWatcher.ObjectChanged(this); } public event PropertyChangedEventHandler PropertyChanged; @@ -338,12 +342,20 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.CSDLType public double Left { get { return Canvas.GetLeft(this); } - set { Canvas.SetLeft(this, value); } + set + { + Canvas.SetLeft(this, value); + OnPropertyChanged("Left"); + } } public double Top { get { return Canvas.GetTop(this); } - set { Canvas.SetTop(this, value); } + set + { + Canvas.SetTop(this, value); + OnPropertyChanged("Top"); + } } } } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/DesignerCanvas.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/DesignerCanvas.cs index dcc74bb391..19ae86913a 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/DesignerCanvas.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/DesignerCanvas.cs @@ -15,6 +15,7 @@ using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.CSDL.Type; using ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.Common; using ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding; using ICSharpCode.Data.EDMDesigner.Core.UI.Helpers; +using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher; #endregion @@ -328,6 +329,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls double currentRowsMaxHeight = 0; EntityTypeDesigner.Init = true; + EDMDesignerChangeWatcher.Init = true; foreach(EntityTypeDesigner entityTypeDesigner in DesignerView.TypeDesignersLocations) { @@ -347,10 +349,17 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls } EntityTypeDesigner.Init = false; + EDMDesignerChangeWatcher.Init = false; } foreach (TypeBaseDesigner typeBaseDesigner in DesignerView) - typeBaseDesigner.DrawRelations(); + { + try + { + typeBaseDesigner.DrawRelations(); + } + catch { } + } (sender as DesignerCanvas).Zoom = DesignerView.Zoom; } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EDMObjectBase.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EDMObjectBase.cs index bd5a3bb8dc..a3b114224c 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EDMObjectBase.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EDMObjectBase.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Text; using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Interfaces; using System.ComponentModel; +using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher; #endregion @@ -48,6 +49,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common { PropertyChanged(this, new PropertyChangedEventArgs(property)); } + + EDMDesignerChangeWatcher.ObjectChanged(this); } #endregion diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/EDMDesignerChangeWatcher.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/EDMDesignerChangeWatcher.cs new file mode 100644 index 0000000000..5d9071079f --- /dev/null +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/EDMDesignerChangeWatcher.cs @@ -0,0 +1,72 @@ +#region Usings + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common; +using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer; +using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.CSDL.Property; + +#endregion + +namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher +{ + public class EDMDesignerChangeWatcher + { + #region Field + + private static List _observers = new List(); + private static bool _init = true; + + #endregion + + #region Properties + + public static bool Init + { + get { return EDMDesignerChangeWatcher._init; } + set { EDMDesignerChangeWatcher._init = value; } + } + + #endregion + + #region Methods + + public static void AddEDMDesignerViewContent(IEDMDesignerChangeWatcherObserver observer) + { + _observers.Add(observer); + } + + public static void RemoveEDMDesignerViewContent(IEDMDesignerChangeWatcherObserver observer) + { + _observers.Remove(observer); + } + + public static void ObjectChanged(EDMObjectBase edmObjectBase) + { + if (_init) + return; + + foreach (IEDMDesignerChangeWatcherObserver observer in _observers) + { + if (observer.ObjectChanged(edmObjectBase)) + break; + } + } + + public static void ObjectChanged(ITypeDesigner typeDesigner) + { + if (_init) + return; + + foreach (IEDMDesignerChangeWatcherObserver observer in _observers) + { + if (observer.ObjectChanged(typeDesigner)) + break; + } + } + + #endregion + } +} diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/IEDMDesignerChangeWatcherObserver.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/IEDMDesignerChangeWatcherObserver.cs new file mode 100644 index 0000000000..d4c7d010b0 --- /dev/null +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/IEDMDesignerChangeWatcherObserver.cs @@ -0,0 +1,17 @@ +#region Usings + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common; + +#endregion + +namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher +{ + public interface IEDMDesignerChangeWatcherObserver + { + bool ObjectChanged(object changedObject); + } +} diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ICSharpCode.Data.EDMDesigner.Core.csproj b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ICSharpCode.Data.EDMDesigner.Core.csproj index 4119b1b09f..c6bb55a142 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ICSharpCode.Data.EDMDesigner.Core.csproj +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ICSharpCode.Data.EDMDesigner.Core.csproj @@ -57,6 +57,8 @@ 3.5 + + 4.0 @@ -97,8 +99,10 @@ + + @@ -143,6 +147,7 @@ + diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/DesignerIO.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/DesignerIO.cs index 1dcb3d64ec..466e12f04d 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/DesignerIO.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/DesignerIO.cs @@ -11,6 +11,7 @@ using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.CSDL; using ICSharpCode.Data.EDMDesigner.Core.EDMObjects; using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.Common; using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common; +using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher; #endregion @@ -30,6 +31,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO public static DesignerView Read(EDMView edmView, Func createEntityDesignerFromUIType, Func createComplexDesignerFromUIType, XElement designerViewXElement) { + EDMDesignerChangeWatcher.Init = true; + var designerView = new DesignerView() { Name = designerViewXElement.Attribute("Name").Value, @@ -76,14 +79,19 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO RoutedEventHandler loaded = null; loaded = delegate { + EDMDesignerChangeWatcher.Init = true; typeDesigner.IsExpanded = bool.Parse(isExpandedAttribute.Value); typeDesigner.Loaded -= loaded; + EDMDesignerChangeWatcher.Init = false; }; typeDesigner.Loaded += loaded; } designerView.TypeDesignersLocations.Add(typeDesigner); } + + EDMDesignerChangeWatcher.Init = false; + return designerView; } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EDMXIO.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EDMXIO.cs index 130e3eb492..e1946be9a9 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EDMXIO.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EDMXIO.cs @@ -56,15 +56,100 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO if (edmxDesigner != null) { - edm.DesignerProperties = edmxDesigner.Element(XName.Get("Connection", edmxNamespace.NamespaceName)).Element(XName.Get("DesignerInfoPropertySet", edmxNamespace.NamespaceName)).Elements(XName.Get("DesignerProperty", edmxNamespace.NamespaceName)).Select(e => new DesignerProperty { Name = e.Attribute("Name").Value, Value = e.Attribute("Value").Value }); - edm.EDMXDesignerDesignerProperties = edmxDesigner.Element(XName.Get("Options", edmxNamespace.NamespaceName)).Element(XName.Get("DesignerInfoPropertySet", edmxNamespace.NamespaceName)).Elements(XName.Get("DesignerProperty", edmxNamespace.NamespaceName)).Select(e => new DesignerProperty { Name = e.Attribute("Name").Value, Value = e.Attribute("Value").Value }); - edm.EDMXDesignerDiagrams = edmxDesigner.Element(XName.Get("Diagrams", edmxNamespace.NamespaceName)).Elements(XName.Get("Diagram", edmxNamespace.NamespaceName)); + if (edmxDesigner.Element(XName.Get("Connection", edmxNamespace.NamespaceName)) != null) + edm.DesignerProperties = edmxDesigner.Element(XName.Get("Connection", edmxNamespace.NamespaceName)).Element(XName.Get("DesignerInfoPropertySet", edmxNamespace.NamespaceName)).Elements(XName.Get("DesignerProperty", edmxNamespace.NamespaceName)).Select(e => new DesignerProperty { Name = e.Attribute("Name").Value, Value = e.Attribute("Value").Value }); + + if (edmxDesigner.Element(XName.Get("Options", edmxNamespace.NamespaceName)) != null) + edm.EDMXDesignerDesignerProperties = edmxDesigner.Element(XName.Get("Options", edmxNamespace.NamespaceName)).Element(XName.Get("DesignerInfoPropertySet", edmxNamespace.NamespaceName)).Elements(XName.Get("DesignerProperty", edmxNamespace.NamespaceName)).Select(e => new DesignerProperty { Name = e.Attribute("Name").Value, Value = e.Attribute("Value").Value }); + + if (edmxDesigner.Element(XName.Get("Diagrams", edmxNamespace.NamespaceName)) != null) + edm.EDMXDesignerDiagrams = edmxDesigner.Element(XName.Get("Diagrams", edmxNamespace.NamespaceName)).Elements(XName.Get("Diagram", edmxNamespace.NamespaceName)); } readMoreAction(edmx); return edm; } + public enum EDMXSection + { + EDMX, + Runtime, + SSDL, + CSDL, + MSL, + Designer, + DesignerViews + } + + public static XElement ReadSection(XDocument edmxDocument, EDMXSection section) + { + return ReadSection(edmxDocument.Root, section); + } + + public static XElement ReadSection(XElement edmxElement, EDMXSection section) + { + if (section == EDMXSection.EDMX) + return edmxElement; + + if (edmxElement == null) + throw new ArgumentException("Input file is not a valid EDMX file."); + + if (section == EDMXSection.Designer || section == EDMXSection.DesignerViews) + { + XElement designerElement = edmxElement.Element(XName.Get("Designer", edmxNamespace.NamespaceName)); + + if (designerElement == null) + return null; + + if (section == EDMXSection.Designer) + return designerElement; + else + { + XElement diagramsElement = designerElement.Element(XName.Get("Diagrams", edmxNamespace.NamespaceName)); + + if (diagramsElement == null) + throw new ArgumentException("Input file is not a valid EDMX file."); + + return diagramsElement.Element(XName.Get("DesignerViews")); + } + } + + XElement runtimeElement = edmxElement.Element(XName.Get("Runtime", edmxNamespace.NamespaceName)); + + if (runtimeElement == null) + throw new ArgumentException("Input file is not a valid EDMX file."); + + if (section == EDMXSection.Runtime) + return runtimeElement; + + switch (section) + { + case EDMXSection.SSDL: + XElement storageModelsElement = runtimeElement.Element(XName.Get("StorageModels", edmxNamespace.NamespaceName)); + + if (storageModelsElement == null) + throw new ArgumentException("Input file is not a valid EDMX file."); + + return storageModelsElement; + case EDMXSection.CSDL: + XElement conceptualModelsElement = runtimeElement.Element(XName.Get("ConceptualModels", edmxNamespace.NamespaceName)); + + if (conceptualModelsElement == null) + throw new ArgumentException("Input file is not a valid EDMX file."); + + return conceptualModelsElement; + case EDMXSection.MSL: + XElement mappingsElement = runtimeElement.Element(XName.Get("Mappings", edmxNamespace.NamespaceName)); + + if (mappingsElement == null) + throw new ArgumentException("Input file is not a valid EDMX file."); + + return mappingsElement; + } + + return null; + } + public static XDocument WriteXDocument(XDocument ssdlDocument, XDocument csdlDocument, XDocument mslDocument) { return WriteXDocument(ssdlDocument.Root, csdlDocument.Root, mslDocument.Root, null); diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EntityModelCodeGenerator.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EntityModelCodeGenerator.cs new file mode 100644 index 0000000000..78c7431c6b --- /dev/null +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EntityModelCodeGenerator.cs @@ -0,0 +1,51 @@ +#region Usings + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ICSharpCode.SharpDevelop.Project; +using System.Data.Entity.Design; +using System.CodeDom; +using System.Data.Metadata.Edm; +using System.Xml.Linq; +using System.IO; + +#endregion + +namespace ICSharpCode.Data.EDMDesigner.Core.IO +{ + public class EntityModelCodeGenerator : IO, ICustomTool + { + #region ICustomTool Member + + public void GenerateCode(FileProjectItem item, CustomToolContext context) + { + LanguageOption languageToGenerateCode = LanguageOption.GenerateCSharpCode; + + if (item.Project.Language != "C#") + languageToGenerateCode = LanguageOption.GenerateVBCode; + + XDocument edmxDocument = XDocument.Load(item.FileName); + XElement conceptualModelsElement = EDMXIO.ReadSection(edmxDocument, EDMXIO.EDMXSection.CSDL); + + if (conceptualModelsElement == null) + throw new ArgumentException("Input file is not a valid EDMX file."); + + XDocument csdlDocument = new XDocument(new XDeclaration("1.0", "utf-8", null), conceptualModelsElement.Element(XName.Get("Schema", csdlNamespace.NamespaceName))); + + string tempFileName = IO.GetTempFilenameWithExtension("csdl"); + csdlDocument.Save(tempFileName); + + string outputFileName = context.GetOutputFileName(item, "Designer"); + + EntityCodeGenerator entityCodeGenerator = new EntityCodeGenerator(languageToGenerateCode); + IList edmSchemaErrors = entityCodeGenerator.GenerateCode(tempFileName, outputFileName); + File.Delete(tempFileName); + + context.EnsureOutputFileIsInProject(item, outputFileName); + } + + #endregion + } +} diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/IO.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/IO.cs index 0c3eb18178..8e1919c04a 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/IO.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/IO.cs @@ -7,6 +7,7 @@ using System; using System.Linq; using System.Xml.Linq; using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common; +using System.IO; #endregion @@ -109,6 +110,29 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO setAction(subElement.Value); } + public static string GetTempFilename() + { + return Path.GetTempFileName(); + } + + public static string GetTempFilenameWithExtension(string filenamePrefix, string extension) + { + string tempFileAuto = GetTempFilename(); + + string tempFile = + Path.GetTempPath() + + filenamePrefix + + Path.GetFileNameWithoutExtension(tempFileAuto) + + "." + extension; + + return tempFile; + } + + public static string GetTempFilenameWithExtension(string extension) + { + return GetTempFilenameWithExtension(string.Empty, extension); + } + #endregion } } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs index 97058e0dac..23c326caa8 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs @@ -22,7 +22,6 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO { public class SSDLIO : IO { - public static XDocument WriteXDocument(SSDLContainer ssdlContainer) { return new XDocument(new XDeclaration("1.0", "utf-8", null), WriteXElement(ssdlContainer)); diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs index 7ff032eabb..d797258705 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs @@ -42,7 +42,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters { XDocument ssdlXDocument = GetSSDLXML(database, modelNamespace); - string ssdlTempFilename = GetTempFilenameWithExtension("ssdl"); + string ssdlTempFilename = IO.IO.GetTempFilenameWithExtension("ssdl"); ssdlXDocument.Save(ssdlTempFilename); FileInfo fileInfo = new FileInfo(ssdlTempFilename); @@ -77,28 +77,5 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters return EDMXIO.WriteXDocument(ssdlXDocument, csdlXDocument, mslXDocument); } - - private static string GetTempFilename() - { - return Path.GetTempFileName(); - } - - private static string GetTempFilenameWithExtension(string filenamePrefix, string extension) - { - string tempFileAuto = GetTempFilename(); - - string tempFile = - Path.GetTempPath() + - filenamePrefix + - Path.GetFileNameWithoutExtension(tempFileAuto) - + "." + extension; - - return tempFile; - } - - private static string GetTempFilenameWithExtension(string extension) - { - return GetTempFilenameWithExtension(string.Empty, extension); - } } }