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);
- }
}
}