如何确定PropertyType是否为外键

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

public partial class schakeling { public schakeling() { this.verbruik = new HashSet(); } public int id { get; set; } public int plc_id { get; set; } public string var_output { get; set; } public string omschrijving { get; set; } public int vermogen { get; set; } public Nullable status { get; set; } public Nullable hourOn { get; set; } public Nullable minuteOn { get; set; } public Nullable hourOff { get; set; } public Nullable minuteOff { get; set; } public virtual plc plc { get; set; } public virtual ICollection verbruik { get; set; } } 

我有一个视图课

 public class SchakelingsListViewModel { public IEnumerable List { get; set; } public PagingInfo PagingInfo { get; set; }//Not relevant for this question //And some more properties...also not relevant } 

我有以下视图(为简洁省略了一些HTML)

 @model PortalControl.ViewModels.SchakelingsListViewModel 

Index

@foreach (var item in Model.List) { @Html.TableRowFor(item) }

我有一个通用的html辅助方法TableRowFor,因为我希望能够在使用EF生成的其他域实体上使用该方法。 该方法生成简单的表数据。

 public static MvcHtmlString TableRowFor(this HtmlHelper helper, T obj) { string controller = obj.GetType().BaseType.Name; string id = obj.GetType().GetProperty("id").GetValue(obj).ToString(); StringBuilder sb = new StringBuilder(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); foreach (var property in obj.GetType().GetProperties()) { //If statement below filters out the two virtual properties(plc, verbruik) of the schakeling class(as said, generated with EF), somewhat ugly but it works, better suggestions are welcome.. if ((!property.PropertyType.Name.ToLower().Contains("icollection")) && (property.PropertyType.CustomAttributes.Count() != 0)) { sb.Append(""); //if property is foreign key //sb.Append(""); //else //sb.Append(property.GetValue(obj)); sb.Append(""); } } sb.Append(""); return new MvcHtmlString(sb.ToString()); } 

我的问题是,如果属性是外键,我想创建一个链接。

我搜索过互联网,但我不是PropertyInfo,MetaDataClassType和其他类似类的专家。 像property.isForeign()这样的东西很可爱,但任何有效的东西都会受到赞赏。

您可以通过此方法从Entity Framework概念模型获取参考导航属性:

 IEnumerable GetReferenceProperies(DbContext context) { var oc = ((IObjectContextAdapter)context).ObjectContext; var entityType = oc.MetadataWorkspace.GetItems(DataSpace.OSpace) .OfType() .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; } } } 

它获取在关联结束时具有0..1所有导航属性,因此排除了集合导航属性。

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

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

  • 为外键提供与其引用的db表名称完全相同的名称
  • 用’_id’结束名称

例:

您有一个名为user的db表,并且想要创建一个名为bill的新db表。 您想使用FK将帐单引用给用户,因此在我的情况下,我会将FK命名为user_id

更新的方法TableRowFor:

 public static MvcHtmlString TableRowFor(this HtmlHelper helper, T obj) { string controller = obj.GetType().BaseType.Name; string id = obj.GetType().GetProperty("id").GetValue(obj).ToString(); StringBuilder sb = new StringBuilder(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); List referencePropertyList = GetReferenceProperies(new NameOfDB()).ToList(); foreach (var property in obj.GetType().GetProperties()) { //If statement below filters out the two virtual properties(plc, verbruik) of the schakeling class(as said, generated with EF), somewhat ugly but it works, better suggestions are welcome.. if ((!property.PropertyType.Name.ToLower().Contains("icollection")) && (property.PropertyType.CustomAttributes.Count() != 0)) { sb.Append(""); //if property is foreign key if (referencePropertyList != null && property.Name.Length >= 3 && referencePropertyList.Contains(property.Name.Substring(0, property.Name.Length - 3))) sb.Append("" + property.GetValue(obj) + ""); else sb.Append(property.GetValue(obj)); sb.Append(""); } } sb.Append(""); return new MvcHtmlString(sb.ToString()); }