views:

534

answers:

2

(Follow-Up-Question to How to change LINQ O/R-M table name/source during runtime?)

I need to change the table source of a LINQ 2 SQL O/R-Mapper table during runtime. To achieve this, I need to create an XmlMappingSource. On command line, I could use SqlMetal to create this mapping file, but I would like to create the mapping file during runtime in memory. The XmlMappingSource is a simple xml file, looking something like this:

<?xml version="1.0" encoding="utf-8"?>
<Database Name="MyDatabase" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007"&gt;
  <Table Name="dbo.MyFirstTable" Member="MyFirstTable">
    <Type Name="MyFirstTable">
      <Column Name="ID" Member="ID" Storage="_ID" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" IsDbGenerated="true" AutoSync="OnInsert" />
      <Association Name="WaStaArtArtikel_WaVerPreisanfragen" Member="WaStaArtArtikel" Storage="_WaStaArtArtikel" ThisKey="ArtikelID" OtherKey="ID" IsForeignKey="true" />
    </Type>
  </Table>
  <Table Name="dbo.MySecondTable" Member="MySecondTable">
    <Type Name="MySecondTable">
      <Column Name="ID" Member="ID" Storage="_ID" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" IsDbGenerated="true" AutoSync="OnInsert" />
      <Column Name="FirstTableID" Member="FirstTableID" Storage="_FirstTableID" DbType="UniqueIdentifier NOT NULL" />
      <Association Name="MySecondTable_MyFirstTable" Member="MyFirstTable" Storage="_MyFirstTable" ThisKey="FirstTableID" OtherKey="ID" IsForeignKey="true" />
    </Type>
  </Table>
</Database>

This should be possible to create using reflection, for example I can get the database name from a data context like this:

using System.Data.Linq.Mapping;
using System.Xml.Linq;

XDocument mapWriter = new XDocument();
DatabaseAttribute[] catx = (DatabaseAttribute[])typeof(WcfInterface.WaDataClassesDataContext).GetCustomAttributes(typeof(DatabaseAttribute), false);
XElement xDatabase = new XElement("Database");
xDatabase.Add(new XAttribute("Name", catx[0].Name));
mapWriter.Add(xDatabase);

My problem: I can't find good documentation of the mapping, so extracting the necessary information is quite error-prone - maybe someone can point me to good docs of the mapping, or, even better, to a code example how to create the mapping file?

+1  A: 

Have you considered using LINQ to Entities, the mapping formats for LINQ to Entities are documented.

Richard
Actually, I was not really aware of L2E as a replacement for L2S.So, in L2E it is possible to just change the mapping during runtime?
Sam
I would not consider L2E as a /replacement/, but as the "big brother". L2S is simple, but limited; L2E is much more functional but harder to use.
Richard
So, how would I change the table name in L2E than?
Sam
I know you /can/ swap mappings, just not /how/. Well until I have sometime available to really dig into L2E.
Richard
A: 

Use Damien Guard's Open Source T4 templates. They do everything SQLMetal can do and more, and you'll have the full T4 engine behind you.

Scott Hanselman
Uhm, maybe you can explain how this would help me for my problem?
Sam