(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'> <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?
Have you considered using LINQ to Entities, the mapping formats for LINQ to Entities are documented.