Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定PropertyType是否为外键_C#_Asp.net Mvc_Entity Framework_Foreign Keys_Html Helper - Fatal编程技术网

C# 如何确定PropertyType是否为外键

C# 如何确定PropertyType是否为外键,c#,asp.net-mvc,entity-framework,foreign-keys,html-helper,C#,Asp.net Mvc,Entity Framework,Foreign Keys,Html Helper,我使用EF生成了以下类“schakeling”,表示数据库表“schakeling”。在数据库中,“id”是主键,“plc_id”是外键 公共部分类schakeling { 公共schakeling() { this.verbruik=new HashSet(); } 公共int id{get;set;} 公共整数plc_id{get;set;} 公共字符串var_输出{get;set;} 公共字符串omschrijving{get;set;} 公共整数vermogen{get;set;} 公共

我使用EF生成了以下类“schakeling”,表示数据库表“schakeling”。在数据库中,“id”是主键,“plc_id”是外键

公共部分类schakeling
{
公共schakeling()
{
this.verbruik=new HashSet();
}
公共int id{get;set;}
公共整数plc_id{get;set;}
公共字符串var_输出{get;set;}
公共字符串omschrijving{get;set;}
公共整数vermogen{get;set;}
公共可空状态{get;set;}
公共可空hourOn{get;set;}
公共可空分钟数{get;set;}
公共可为空的hourOff{get;set;}
公共可为空的minuteOff{get;set;}
公共虚拟plc{get;set;}
公共虚拟ICollection verbruik{get;set;}
}
我有一节观景课

公共类SchakelingListViewModel
{
公共IEnumerable列表{get;set;}
公共分页信息分页信息{get;set;}//与此问题无关
//还有一些其他属性…也不相关
}
我有以下观点(为了简洁起见省略了一些HTML)

@model PortalControl.ViewModels.SchakelingsListViewModel
指数
@foreach(Model.List中的var项){
@Html.TableRowFor(项目)
}
我有一个通用的html助手方法TableRowFor,因为我希望能够在使用EF生成的其他域实体上使用该方法。该方法生成简单的表数据

public static MvcHtmlString TableRowFor(此HtmlHelper帮助程序,T obj)
{
字符串控制器=obj.GetType().BaseType.Name;
字符串id=obj.GetType().GetProperty(“id”).GetValue(obj.ToString();
StringBuilder sb=新的StringBuilder(“”);
某人加上(“”);
某人加上(“”);
某人加上(“”);
某人加上(“”);
某人加上(“”);
foreach(obj.GetType().GetProperties()中的var属性)
{
//如果下面的语句过滤掉了schakeling类的两个虚拟属性(plc、verbruik)(如前所述,是用EF生成的),虽然有点难看,但效果不错,欢迎提出更好的建议。。
如果((!property.PropertyType.Name.ToLower().Contains(“icollection”)&&(property.PropertyType.CustomAttributes.Count()!=0))
{
某人加上(“”);
//如果属性是外键
//某人加上(“”);
//否则
//sb.Append(property.GetValue(obj));
某人加上(“”);
}
}
某人加上(“”);
返回新的MvcHtmlString(sb.ToString());
}
我的问题是,如果属性是外键,我想创建一个链接


我在互联网上搜索过,但我在PropertyInfo、MetaDataClassType和其他类似的类方面不是专家。类似property.isForeign()的东西会很可爱,但任何有效的东西都会受到欢迎。

您可以通过以下方法从实体框架概念模型中获取参考导航属性:

IEnumerable<string> GetReferenceProperies<T>(DbContext context)
{
    var oc = ((IObjectContextAdapter)context).ObjectContext;
    var entityType = oc.MetadataWorkspace.GetItems(DataSpace.OSpace)
                       .OfType<EntityType>()
                       .FirstOrDefault (et => et.Name == typeof(T).Name);
    if (entityType != null)
    {
        foreach (NavigationProperty np in entityType.NavigationProperties
                .Where(p => p.ToEndMember.RelationshipMultiplicity
                                     == RelationshipMultiplicity.One
                         || p.ToEndMember.RelationshipMultiplicity
                                     == RelationshipMultiplicity.ZeroOrOne))
        {
            yield return np.Name;
        }
    }
}
IEnumerable GetReferenceProperties(DbContext上下文)
{
var oc=((IObjectContextAdapter)context).ObjectContext;
var entityType=oc.MetadataWorkspace.GetItems(DataSpace.OSpace)
第()类
.FirstOrDefault(et=>et.Name==typeof(T.Name);
if(entityType!=null)
{
foreach(entityType.NavigationProperties中的NavigationProperty np
.其中(p=>p.ToEndMember.RelationshipMultiplicity
==关系多重性。1
||p.ToEndMember.RelationshipMultiplicity
==关系(多重性(零龙))
{
收益率返回np.Name;
}
}
}
它获取在关联末尾具有
0..1
的所有导航属性,因此排除集合导航属性


现在,您可以使用属性名称获取匹配的
PropertyInfo
s并获取属性的值。

我使用您的方法获得了它,非常感谢。对于其他人,请记住,只有在使用像我这样的命名约定时,此解决方案才有效(但是,您可以使用Gert方法作为指导,为自己的解决方案铺平道路):

  • 为外键指定与其引用的db表的名称完全相同的名称
  • 以“\u id”结束名称
例如:

您有一个名为user的db表,并且希望创建一个名为bill的新db表。您希望将账单提交给使用FK的用户,因此在我的情况下,我会将FK用户的id命名为

更新的方法TableRowFor:

public static MvcHtmlString TableRowFor(此HtmlHelper帮助程序,T obj)
{
字符串控制器=obj.GetType().BaseType.Name;
字符串id=obj.GetType().GetProperty(“id”).GetValue(obj.ToString();
StringBuilder sb=新的StringBuilder(“”);
某人加上(“”);
某人加上(“”);
某人加上(“”);
某人加上(“”);
某人加上(“”);
List referencePropertyList=GetReferenceProperties(新名称of DB()).ToList();
foreach(obj.GetType().GetProperties()中的var属性)
{
//如果下面的语句过滤掉了schakeling类的两个虚拟属性(plc、verbruik)(如前所述,是用EF生成的),虽然有点难看,但效果不错,欢迎提出更好的建议。。
如果((!property.PropertyType.Name.ToLower().Contains(“icollection”)&&(property.PropertyType.CustomAttributes.Count()!=0))
{
某人加上(“”);
//如果属性是外键
如果(referencePropertyList!=null&&property.Name.Length>=3&&referencePropertyList.Contains(property.Name.Substring(0,property.Name.Length-3)))
某人加上(“”);
其他的
sb.Append(property.GetValue(obj));
某人加上(“”);
}
}
某人加上(“”);
返回新的MvcHtmlString(sb.ToString());
}