Visual studio 2013 从T4模板生成器中查找外键

Visual studio 2013 从T4模板生成器中查找外键,visual-studio-2013,entity-framework-6,t4,asp.net-4.0,Visual Studio 2013,Entity Framework 6,T4,Asp.net 4.0,我正在尝试为实体中的每个外键生成一个方法,以返回基于该外键的记录列表。我知道一种确定主键的方法: foreach (var edmProperty in simpleProperties) { bool isPrimaryKey = ef.IsKey(edmProperty); if(isPrimaryKey) { //do stuff } } 有没有办法找到外键? 我正在Visual Studio 2013中使用EF 6。 谢谢,不要这样做。出于

我正在尝试为实体中的每个外键生成一个方法,以返回基于该外键的记录列表。我知道一种确定主键的方法:

foreach (var edmProperty in simpleProperties)
{
    bool isPrimaryKey = ef.IsKey(edmProperty);
    if(isPrimaryKey)
    {
       //do stuff
    }
}
有没有办法找到外键? 我正在Visual Studio 2013中使用EF 6。
谢谢,不要这样做。出于许多原因:

  • 它打破了无知。POCO不应该知道任何有关数据层的信息。您甚至可以在没有EF引用的单独程序集中定义POCO
  • GetByCountryID
    这样的方法通常是存储库方法,它们不属于实体类
  • 静态方法不应该分散在类模型上。它们是典型的实用程序类或工厂(使用类似于
    City.New()
    的方法可能是有意义的)
  • 你怎么知道
    City
    有一个
    GetByCountryID
    方法?甚至可能有更多的类具有相同的方法
  • 通过该方法获得的对象与
    城市
    实例没有任何关联,但其位置似乎有意进行此类关联
  • 如果从EDMX中删除属性
    Country
    (例如,因为从未使用过),该方法也将消失
  • 主要原因:导航属性无法替代。如果您想获得
    类别
    及其
    产品
    ,您必须以EF知道如何关联它们的方式加载它们。您可以通过
    Include
    ,或通过将它们包含在投影中,或通过延迟加载,或通过稍后获取
    产品,但所有都在同一上下文中来实现这一点。您建议的方法只能生成分离的实体,也可以生成断开连接的实体(即,不附加到上下文)

还有其他模式可以从其他应用程序层隐藏数据层详细信息,例如带有依赖项注入的存储库。

以下是获取外键属性名称的方法

public IEnumerable<NavigationProperty> GetParentNavigationProperties(EntityType type)
{
    return type.NavigationProperties.Where(np => np.DeclaringType == type && np.ToEndMember.RelationshipMultiplicity != RelationshipMultiplicity.Many);
}
公共IEnumerable GetParentNavigationProperties(EntityType类型) { 返回类型.NavigationProperties.Where(np=>np.DeclaringType==type&&np.ToEndMember.RelationshipMultiplicity!=RelationshipMultiplicity.Many); }
“返回记录列表”。。。这就是集合导航属性的用途。我不确定你想要达到什么目标。比如说我有一个产品。我的产品有一个类别ID作为外键。我想使用我的T4模板生成一个方法,以返回具有给定categoryID的所有产品。当我在实体的T4模板中遍历所有属性时,我如何判断哪个属性是外键,以便创建此方法。我可以找出哪个是主键,而不是外键。为什么是方法?在哪个班
Category
将具有导航属性
Products
。我想向生成的代码添加一个方法,这样我就不会在codebehind中有我的上下文。这将适用于我的模型中从实体框架(数据库优先模型)生成的所有类。我想我可以从Category类中获得它,但是如果我想返回产品,我必须创建一个自定义方法,比如ctx.Categories.Include(“产品”).ToList()。或者在我的codebehind中有上下文,这样当我访问类别时,产品将自动加载。为什么不展示一个这样一个方法的示例?我仍然不清楚,主要是因为你从来不知道这些方法应该属于哪里以及它们应该如何操作。我明白你的意思…但是在你的代码背后有你的上下文不是一个坏主意,因为它与你的UI相关联吗?我想这就是你关于存储库和依赖注入的建议的用武之地……对这种模式不太熟悉。如果你的实体没有引用,为什么上下文会绑定到UI?例如,如果您有一个返回实体的服务层,那么服务外部的任何人都不需要知道EF。当您说“您有一个返回实体的服务层,服务外部的任何人都不需要知道EF”…我需要在T4模板生成的基础上再增加一个层吗?我认为与实体交互并将对象返回到UI的方法(由T4模板生成)是我的服务层。如果我将:using(MyEntities ctx=new MyEntities()){//do stuff with my context}…放在我的codebehind中,那么我的UI直接绑定到数据层。如果我没有遵守,我很抱歉。是的,在这种情况下,UI引用了EF。这并不一定不好,但通常您将在单独的程序集中创建服务层,其中可能有类,如
ProductService
,具有方法,如
GetProducts(某些规范)
,或
CreateProduct(某些其他规范或产品实体)
。这些服务可以直接或通过存储库与EF通信,尽管我不喜欢后者。谢谢Gert。我明白你的意思。我试图实现的结果是通过T4模板创建这些GetProducts()和CreateProduct()方法,但我可能应该保持生成的代码不变,并为此添加另一层。谢谢