templates - EF4 : Get the linked column names from NavigationProperty of an EDMX

标签 templates entity-framework-4 foreign-keys t4 edmx

我正在通过使用 EDMX 文件中的 T4 模板生成 POCO(假设它们是 MyEntityObject 的子类)。

我有 3 个实体,例如:

  • MyTable1(主键:MyTable1ID)
  • MyTable2(主键:MyTable2ID)
  • MyTable3(主键:MyTable3ID)

这些实体具有以下关系:

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

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

或者在另一个 View 中:

MyTable1 <= MyTable2 <= MyTable3

我想提取所有外键关系

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

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

类似这样的事情:

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 附带的某些文本模板中可用,因此了解此方法的作用很有帮助。

如果您想始终知道列名称,则需要从存储模型加载 AssociationType,如下所示:

// 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));

在本例中,loader 是 EF.Utility.CS.ttinclude 中定义的 MetadataLoader,而 inputFile 是指定 .edmx 文件名称的标准字符串变量。这些应该已经在您的文本模板中声明。

关于templates - EF4 : Get the linked column names from NavigationProperty of an EDMX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5365708/

相关文章:

entity-framework - Entity Framework 在多对多更新场景中附加麻烦

c# - 是否可以防止 Entity Framework 4 覆盖自定义属性?

postgresql - 添加主键 : Table contains duplicated values

node.js - Jade Include 不渲染包含的页面内容

c++ - python中具有静态成员的模板上的swig undefined symbol

c# - 在 Entity Framework 中动态添加 where 子句

PHP 版本 5.3.10 删除外键

mysql - Laravel 抛出一般错误 : 1215 Cannot add foreign key constraint"when I create foreign keys

c++ - 编译时间与运行时递归

c++ - g++ c++17 类模板参数推导在非常特殊的情况下不起作用