【发布时间】:2009-02-25 10:38:26
【问题描述】:
(对How to change LINQ O/R-M table name/source during runtime?的后续问题)
我需要在运行时更改 LINQ 2 SQL O/R-Mapper 表的表源。为此,我需要创建一个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 to SQL 以避免与 LINQ to Entities 混淆(与 LINQ to SQL 相比,它更像是一种 ORM —— 更丰富的映射能力)。
标签: c# .net xml linq-to-sql