EF4:从EDMX的NavigationProperty获取链接的列名称 [英] EF4: Get the linked column names from NavigationProperty of an EDMX

查看:191
本文介绍了EF4:从EDMX的NavigationProperty获取链接的列名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用EDMX文件中的T4模板生成POCO(可以说它们是MyEntityObject 的子类)。

I am generating POCOs (lets say they are subclasses of MyEntityObject) by using a T4 template from an EDMX file.

我有3个实体,例如:


  • MyTable1 (PrimaryKey:MyTable1ID)

  • MyTable2 (PrimaryKey:MyTable2ID)

  • MyTable3 (PrimaryKey:MyTable3ID)

  • MyTable1 (PrimaryKey: MyTable1ID)
  • MyTable2 (PrimaryKey: MyTable2ID)
  • MyTable3 (PrimaryKey: MyTable3ID)

这些实体有以下关系:


MyTable1.MyTable1ID< =>
MyTable2.MyTable1ID(MyTable1ID是MyTable1的
外键)

MyTable1.MyTable1ID <=> MyTable2.MyTable1ID (MyTable1ID is the foreign key to MyTable1)

MyTable2.MyTable2ID< =>
MyTable3.MyTable2ID(MyTable2ID是
MyTable2的外键)

MyTable2.MyTable2ID <=> MyTable3.MyTable2ID (MyTable2ID is the foreign key to MyTable2)

或在另一个视图中:

MyTable1< = MyTable2< = MyTable3

MyTable1 <= MyTable2 <= MyTable3

我想提取所有外键关系

NavigationProperty[] foreignKeys = entity.NavigationProperties.Where(np => np.DeclaringType == entity && ((AssociationType)np.RelationshipType).IsForeignKey).ToArray();
forewach (NavigationProperty foreignKey in foreignKeys)
{
    // generate code....
}

我的问题:如何提取两个实体之间链接的列名称?

My Question: How can I extract the column names that are linked between two entities?

这样的东西:

void GetLinkedColumns(MyEntityObject table1, MyEntityObject table2, out string fkColumnTable1, out string fkColumnTable2)
{
    // do the job
}

在示例中

string myTable1Column;
string myTable2Column;
GetLinkedColumns(myTable1, myTable2, out myTable1Column, out myTable2Column);

结果应该是

myTable1Column = "MyTable1ID";
myTable2Column = "MyTable2ID";


推荐答案

如果您的外键列被暴露,第一个答案有效作为您的概念模型中的属性。此外,GetSourceSchemaTypes()方法仅在EF中包含的一些文本模板中可用,因此有助于了解此方法的作用。

The first answer works if your foreign key columns are exposed as properties in your conceptual model. Also, the GetSourceSchemaTypes() method is only available in some of the text templates included with EF, so it is helpful to know what this method does.

如果要总是知道列名,你将需要从存储模型中加载AssociationType,如下所示:

If you want to always know the column names, you will need to load the AssociationType from the storage model as follows:

// Obtain a reference to the navigation property you are interested in
var navProp = GetNavigationProperty();

// Load the metadata workspace
MetadataWorkspace metadataWorkspace = null;
bool allMetadataLoaded =loader.TryLoadAllMetadata(inputFile, out metadataWorkspace);

// Get the association type from the storage model
var association = metadataWorkspace
    .GetItems<AssociationType>(DataSpace.SSpace)
    .Single(a => a.Name == navProp.RelationshipType.Name)

// Then look at the referential constraints
var toColumns = String.Join(",", 
    association.ReferentialConstraints.SelectMany(rc => rc.ToProperties));
var fromColumns = String.Join(",", 
    association.ReferentialConstraints.SelectMany(rc => rc.FromProperties));

在这种情况下,加载程序是在EF.Utility.CS.ttinclude中定义的MetadataLoader,而inputFile是标准字符串变量,指定.edmx文件的名称。这些应该已经在您的文本模板中被声明。

In this case, loader is a MetadataLoader defined in EF.Utility.CS.ttinclude and inputFile is a standard string variable specifying the name of the .edmx file. These should already be declared in your text template.

这篇关于EF4:从EDMX的NavigationProperty获取链接的列名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆