我尝试从edmx文件中获取实体的FK集合。我找不到返回集合的方法或属性,或者只找到bool属性来表明实体的属性是FK。 我在MetadataProperties中搜索了EntityContainer类并且没有找到任何内容。我在类中搜索属性GetProperties和相同的结果,我找不到方法或属性来表示FK。 我如何从edmx文件中获取FK或实体FK的指示?
抱歉我的英文不好。
由于
答案 0 :(得分:0)
您可以使用反射获取外键并过滤ForeignKeyAttribute上的属性。
public static IEnumerable<PropertyInfo> GetForeignKeyProps(Type type) {
return type.GetProperties()
.Where(prop => prop.IsDefined(typeof(ForeignKeyAttribute), false));
}
用法,获取值:
var obj = new T();
var foreignKeyPropertyInfos = GetForeignKeyProps(typeof (T));
foreach (var foreignKeyPropertyInfo in foreignKeyPropertyInfos)
{
var value = foreignKeyPropertyInfo.GetValue(obj)
}
答案 1 :(得分:0)
您可能正在寻找ObjectSet(来自旧版EF),它可让您访问导航属性。你可以像这样得到它:
var objectContext = ((IObjectContextAdapter)db).ObjectContext;
var os = objectContext.CreateObjectSet<TEntity>();
var foreignKeyProperties = os.EntitySet.ElementType.NavigationProperties.Where(x => x.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.One);
db
是DBContext
,TEntity
是您正在使用的实体的类型
答案 2 :(得分:0)
您可以在实体模型中找到与特定实体相关的所有外键,如下所示
var fk = _entities.MetadataWorkspace.GetItems<AssociationType>(DataSpace.CSpace).Where(a => a.IsForeignKey);
//check if the table has any foreign constraints for that column
var fkname = fk.Where(x => x.ReferentialConstraints[0].ToRole.Name == tablename).Where(x => x.ReferentialConstraints[0].ToProperties[0].Name == columnname);
//Get the corresponding reference entity column name
var refcol = fkname.Select(x => x.ReferentialConstraints[0].FromProperties[0].Name).First();