(對How to change LINQ O/R-M table name/source during runtime?的後續問題)如何在運行時創建XmlMappingSource?
我需要在運行時更改LINQ 2 SQL O/R映射表的表來源。要實現這一點,我需要創建一個XmlMappingSource。在命令行上,我可以使用SqlMetal來創建這個映射文件,但是我想在運行時在內存中創建映射文件。 的XmlMappingSource是一個簡單的XML文件,看起來像這樣:
<?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>
這應該是可以使用反射來創建,例如,我可以從數據方面得到數據庫名是這樣的:
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);
我的問題:我無法找到良好的映射文檔,因此提取必要的信息非常容易出錯 - 也許有人可以將我指向映射的良好文檔,或者甚至更好地指向代碼示例如何創建映射文件?
建議你說的LINQ到在此開始明確SQL來避免與LINQ混亂實體(這是更爲的比LINQ to SQL更爲豐富的映射功能)。 – Richard 2009-02-25 11:36:41
是的,對,完成 - 謝謝! – Sam 2009-02-25 13:29:49