Browse Source

EDMX: Custom Tool, Designer IsDirty Watcher

pull/1/head
philippmaihart 15 years ago
parent
commit
c39147cf60
  1. 9
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/ICSharpCode.Data.addin
  2. 24
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/Templates/Files/CSharp.EDMX.xft
  3. 53
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs
  4. 16
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/CSDLType/TypeBaseDesigner.xaml.cs
  5. 11
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/DesignerCanvas.cs
  6. 3
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EDMObjectBase.cs
  7. 72
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/EDMDesignerChangeWatcher.cs
  8. 17
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/IEDMDesignerChangeWatcherObserver.cs
  9. 5
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ICSharpCode.Data.EDMDesigner.Core.csproj
  10. 8
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/DesignerIO.cs
  11. 91
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EDMXIO.cs
  12. 51
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EntityModelCodeGenerator.cs
  13. 24
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/IO.cs
  14. 1
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs
  15. 25
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs

9
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/ICSharpCode.Data.addin

@ -38,7 +38,7 @@ @@ -38,7 +38,7 @@
<DisplayBinding id="EDMDesignerDisplayBinding"
class="ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding.EDMDesignerDisplayBinding"
insertbefore="Text"
fileNamePattern="\.(edmx)$"
fileNamePattern="\.edmx$"
languagePattern="^Edmx$" />
</Path>
@ -46,4 +46,11 @@ @@ -46,4 +46,11 @@
<Path name = "/SharpDevelop/BackendBindings/Templates">
<Directory id = "Data" path = "./Templates/Files" />
</Path>
<!-- Custom tools path-->
<Path name = "/SharpDevelop/CustomTools">
<CustomTool id = "EntityModelCodeGenerator"
class = "ICSharpCode.Data.EDMDesigner.Core.IO.EntityModelCodeGenerator"
fileNamePattern = "\.edmx$"/>
</Path>
</AddIn>

24
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/Templates/Files/CSharp.EDMX.xft

@ -9,8 +9,26 @@ @@ -9,8 +9,26 @@
language = "C#" />
<Description>Entity Framework Data Model</Description>
<!--
<References>
<Reference include="System.Data">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference include="System.Data.Entity">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference include="System.Runtime.Serialization">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference include="System.Security">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference include="System.XML">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
</References>
<!--
Special new file templates:
${StandardNamespace} -> Standardnamespace of the current project or FileNameWithoutExtension
${FullName} -> Full generated path name
@ -20,7 +38,7 @@ @@ -20,7 +38,7 @@
${Path} -> Full path of the file
-->
<Files>
<File name="${FullName}" language="XML" buildAction="Page">
<File name="${FullName}" language="XML" buildAction="EntityDeploy" CustomTool="EntityModelCodeGenerator">
<![CDATA[<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
<!-- EF Runtime content -->

53
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs

@ -20,12 +20,14 @@ using ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.CSDLType; @@ -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 @@ -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 @@ -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 @@ -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<XElement> readMoreAction = edmxElt => edmxElement = edmxElt;
@ -114,15 +120,17 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding @@ -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 @@ -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 @@ -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 @@ -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
}
}

16
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; @@ -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 @@ -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 @@ -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 @@ -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");
}
}
}
}

11
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; @@ -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 @@ -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 @@ -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;
}

3
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EDMObjectBase.cs

@ -6,6 +6,7 @@ using System.Linq; @@ -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 @@ -48,6 +49,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
EDMDesignerChangeWatcher.ObjectChanged(this);
}
#endregion

72
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/EDMDesignerChangeWatcher.cs

@ -0,0 +1,72 @@ @@ -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<IEDMDesignerChangeWatcherObserver> _observers = new List<IEDMDesignerChangeWatcherObserver>();
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
}
}

17
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/IEDMDesignerChangeWatcherObserver.cs

@ -0,0 +1,17 @@ @@ -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);
}
}

5
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ICSharpCode.Data.EDMDesigner.Core.csproj

@ -57,6 +57,8 @@ @@ -57,6 +57,8 @@
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data.Entity" />
<Reference Include="System.Data.Entity.Design" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
@ -97,8 +99,10 @@ @@ -97,8 +99,10 @@
<Compile Include="EDMObjects\Designer\Common\DesignerProperty.cs" />
<Compile Include="EDMObjects\Designer\DesignerView.cs" />
<Compile Include="EDMObjects\Designer\EDMController.cs" />
<Compile Include="EDMObjects\Designer\ChangeWatcher\EDMDesignerChangeWatcher.cs" />
<Compile Include="EDMObjects\Designer\EDMView.cs" />
<Compile Include="EDMObjects\Designer\Common\IndexableUIBusinessTypeObservableCollection.cs" />
<Compile Include="EDMObjects\Designer\ChangeWatcher\IEDMDesignerChangeWatcherObserver.cs" />
<Compile Include="EDMObjects\Designer\ItemBase.cs" />
<Compile Include="EDMObjects\Designer\ITypeDesigner.cs" />
<Compile Include="EDMObjects\Designer\Common\UIBusinessType.cs" />
@ -143,6 +147,7 @@ @@ -143,6 +147,7 @@
<Compile Include="IO\CSDLIO.cs" />
<Compile Include="IO\DesignerIO.cs" />
<Compile Include="IO\EDMXIO.cs" />
<Compile Include="IO\EntityModelCodeGenerator.cs" />
<Compile Include="IO\ExtensionMethods.cs" />
<Compile Include="IO\IO.cs" />
<Compile Include="IO\MSLIO.cs" />

8
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/DesignerIO.cs

@ -11,6 +11,7 @@ using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.CSDL; @@ -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 @@ -30,6 +31,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
public static DesignerView Read(EDMView edmView, Func<UIEntityType, ITypeDesigner> createEntityDesignerFromUIType, Func<UIComplexType, ITypeDesigner> 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 @@ -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;
}

91
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EDMXIO.cs

@ -56,15 +56,100 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO @@ -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);

51
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EntityModelCodeGenerator.cs

@ -0,0 +1,51 @@ @@ -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<EdmSchemaError> edmSchemaErrors = entityCodeGenerator.GenerateCode(tempFileName, outputFileName);
File.Delete(tempFileName);
context.EnsureOutputFileIsInProject(item, outputFileName);
}
#endregion
}
}

24
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/IO.cs

@ -7,6 +7,7 @@ using System; @@ -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 @@ -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
}
}

1
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs

@ -22,7 +22,6 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO @@ -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));

25
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs

@ -42,7 +42,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters @@ -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 @@ -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);
}
}
}

Loading…
Cancel
Save