Entity framework 4 从EDMX文件获取架构

Entity framework 4 从EDMX文件获取架构,entity-framework-4,t4,Entity Framework 4,T4,我需要修改T4模板POCO.tt以从EDMX文件检索数据库模式。我可以在XML中看到EntitySet标记中存储的模式。但是,当使用EntitySet对象时,我在任何地方都找不到模式 有人知道在哪里可以找到数据库模式吗 谢谢我想我第一次误解了你的问题。您是否检查过edmx模式以获取任何线索 根据此链接:http://msdn.microsoft.com/en-us/library/cc982042.aspx 用于以下应用程序的架构: 目标.NET Framework版本4是 定义在 Micros

我需要修改T4模板POCO.tt以从EDMX文件检索数据库模式。我可以在XML中看到EntitySet标记中存储的模式。但是,当使用EntitySet对象时,我在任何地方都找不到模式

有人知道在哪里可以找到数据库模式吗


谢谢

我想我第一次误解了你的问题。您是否检查过edmx模式以获取任何线索

根据此链接:
http://msdn.microsoft.com/en-us/library/cc982042.aspx

用于以下应用程序的架构: 目标.NET Framework版本4是 定义在 Microsoft.Data.Entity.Design.Edmx_2.xsd 文件用于以下应用程序的架构: 以.NET Framework 3.5版为目标 SP1是在 Microsoft.Data.Entity.Design.Edmx_1.xsd 文件

对于VS 2010,这些是%VS100COMNTOOLS%\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 我在一篇博文中总结了我的发现:

我自己也遇到了同样的问题。 首先,需要从edmx文件的存储模型内容(edmx:StorageModels)部分检索EntityContainer

在tt模板的顶部(实例化MetadataLoader并声明inputFile之后),添加以下代码以获取存储模型内容EntityContainer

StoreItemCollection sic;
loader.TryCreateStoreItemCollection(inputFile, out sic);
EntityContainer sicEntityContainer = sic.GetItems<EntityContainer>().First();

注意:您可能需要重复tt模板下方ComplexType属性的get schema代码。请参见,您可以通过Visual Studio中的NuGet安装它,它提供Microsoft对您隐藏的EDMX文件中的所有元数据,非常简单,效果非常好。您希望访问所有底层存储信息,如属性SQL类型、模式等。您甚至可以使用github repo中的示例Windows.Forms应用程序设置断点并检查数据。

我正在使用EF6,希望向t4模板生成的类添加摘要注释。经过一段时间的黑客攻击,我通过加载EDMX文件并使用XPath查找所需内容,成功地做到了这一点

var xmlContent=XDocument.Load(textcransform.Host.ResolvePath(inputFile));
var edmxNavigator=xmlContent.CreateNavigator();
XmlNamespaceManager nsMgr=新的XmlNamespaceManager(edmxNavigator.NameTable);
nsMgr.AddNamespace(“edmx”http://schemas.microsoft.com/ado/2009/11/edmx");
nsMgr.AddNamespace(“存储区”http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator");
nsMgr.AddNamespace(“ssdl”http://schemas.microsoft.com/ado/2009/11/edm/ssdl");
nsMgr.AddNamespace(“cs”http://schemas.microsoft.com/ado/2009/11/mapping/cs");
//这是默认模板附带的循环
foreach(typeMapper.GetItemsToGenerate(itemCollection)中的var实体)
{
fileManager.StartNewFile(entity.Name+“.cs”);
BeginNamespace(代码);
var mappingAttribute=edmxNavigator.SelectSingleNode(“/edmx:edmx/edmx:Runtime/edmx:Mappings/cs:EntityContainerMapping/cs:EntitySetMapping/cs:EntityTypeMapping[@TypeName=\”“+entity.FullName+“\”]/cs:MappingFragment/@StoreEntitySet”,nsMgr);
var entitySet=edmxNavigator.SelectSingleNode(“/edmx:edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema/ssdl:EntityContainer/ssdl:entitySet[@Name=\”“+mappingAttribute.Value+“\”],nsMgr);
变量actualTableName=(entitySet.SelectSingleNode(@Table”)??entitySet.SelectSingleNode(@Name”).Value;
var actualSchemaName=(entitySet.SelectSingleNode(@Schema,nsMgr)??entitySet.SelectSingleNode(@store:Schema,nsMgr)).Value;
#>
/// 
///数据库对象:。
/// 

谢谢。我已经有一段时间没有编写这组代码了,但这些信息仍然很有用。
code.Escape(实体)
应该是
entity.Name
,因为如果名称恰好是关键字,Escape将添加
@
。此外,这也不是万无一失的,因为传递给
GetEntitySetByName
的名称来自edmx:ConceptualModels部分,而实际上您正试图在edmx:StorageModels下查找名称。这些不是必须相同,并且在“C-S”映射部分下映射。遗憾的是,没有容易阅读的API(请参阅)。
EntitySet eset = sicEntityContainer.GetEntitySetByName(code.Escape(entity), true);
string schemaName = eset.MetadataProperties["Schema"].Value.ToString();