从.Net Core 1.1中的ModelMetaData获取RelatedEntities

时间:2017-06-30 21:59:18

标签: c# razor .net-core asp.net-mvc-scaffolding

我试图在脚手架上下文中获取.Net Core中的相关实体。

我正在构建一个正在构建的MVC中的Details页面。我需要属性和导航。显示所有相关属性,但是,只有非ICollection 导航属性显示在.Navigations中。

正在加载的对象是 Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore.ModelMetaData

foreach (var property in Model.ModelMetadata.Properties)
{
    if (property.Scaffold && !property.IsPrimaryKey && !property.IsForeignKey)
    {
        <dt>
            @@Html.DisplayNameFor(model => model.@GetValueExpression(property))
        </dt>
        <dd>
            @@Html.DisplayFor(model => model.@GetValueExpression(property))
        </dd>
    }
}
foreach (var navigation in Model.ModelMetadata.Navigations)
{
    <dt>
        @@Html.DisplayNameFor(model => model.@GetValueExpression(navigation))
    </dt>
    <dd>
        <a asp-area="" @GetNavigationLinkExpression(navigation)>@@Html.DisplayFor(model => model.@GetValueExpression(navigation).@navigation.DisplayPropertyName)</a>
    </dd>
}

我的模型就是这样......而ModelMetaData只能浏览第二个并跳过第一个。我在哪里可以访问第一个属性,以便我可以模板化?

public virtual ICollection<SomeModel> CollectionNavigationProperty1 { get; set; }
public virtual AnotherSomeModel NavigationProperty1 { get; set; }

1 个答案:

答案 0 :(得分:1)

好吧,经过几个小时的尝试,我设法制作了一个远不如我想要的动态变通方法。我只是无法弄清楚如何获取实体模型的Type对象。

您可以按如下方式获取ICollection对象列表:

Person

将'YourProjectName.ContextObject'替换为DbContext对象的完整名称空间和类名。 替换'YourProjectName.Entities。'使用您的实体所在的完整命名空间。

只有当您的实体/模型保存在同一名称空间中时,这才能正常工作。

希望有人可以提供更好的解决方案,但这将是我现在使用的。