gpt4 book ai didi

entity-framework-4 - Entity Framework : How to get the EntitySetName of a TPT or TPH Entity

转载 作者:行者123 更新时间:2023-12-04 06:11:20 26 4
gpt4 key购买 nike

我有一个 Employee 实体,它继承自一个继承自 Resource 实体(Employee -> Person -> Resource)的 Person 实体。是否可以通过编程方式获取 Employee 的 EntitySetName(应该是 Resources)?

最佳答案

我从这里举个例子......

http://msmvps.com/blogs/kevinmcneish/archive/2009/12/03/entity-framework-programmatically-determining-the-entity-set-name-of-an-entity.aspx

... 只考虑 else代码片段中的案例(因此,我们没有带键的实体实例):

// I have tested with EF 4.1/DbContext, for EF 4.0 forget this line
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;

Type entityType = typeof(Employee);
string entityTypeName = entityType.Name;

var container = objectContext.MetadataWorkspace.GetEntityContainer(
objectContext.DefaultContainerName, DataSpace.CSpace);
string entitySetName = (from meta in container.BaseEntitySets
where meta.ElementType.Name == entityTypeName
select meta.Name).First();
string fullEntitySetName = container.Name + "." + entitySetName;

现在的问题是这段代码在 First()中抛出了一个异常因为没有 BaseEntitySet元素类型名称等于“员工”。显然是因为模型中只有一个基本类型的集合 = "Resource"。

一个可能的解决方法是将上面的第二行和第三行更改为:

Type entityType = typeof(Employee);
while (entityType.BaseType.Name != "Object")
entityType = entityType.BaseType;
string entityTypeName = entityType.Name;

这应该将“资源”归还为 entitySetName 如果 ...
  • 您的实体并非源自 EntityObject (在这种情况下,如果您在上面的 while 循环中将“Object”替换为“EntityObject”,它可能会起作用)
  • 您的实体不是从另一个不是模型中实体的自定义类型派生的。例如,如果您有 Resource派生自基类型 MyBaseObject但没有将它包含在模型中(没有 DbSet<MyBaseObject>ObjectSet<MyBaseObject> )那么您必须在 while 中用“MyBaseObject”替换“Object”环形。

  • 第二个限制不是很好,因为您的实体类中可能有不同的非模型基类型,这会使上面的代码不太适用。

    也许有更聪明的方法可以直接从 MetadataWorkspace 获取模型基类型,但我不知道。

    关于entity-framework-4 - Entity Framework : How to get the EntitySetName of a TPT or TPH Entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7732774/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com