假设我有一个由实体框架生成的类Student
。
Student
具有以下属性:
Id int,
Name, string
Age, int
TeacherId int
进一步假设Id
指的是SQL中的主键,用于标识Student
个对象引用的学生,TeacherId
是一个外键,用于指示学生的教师是谁。< / p>
假设我想编写一个函数,它将任何 EntityObject
(例如这个)作为参数,并返回有关哪些属性是主键和外键的信息。
我该怎么做?
如果这不合适,那么Entity Framework如何告诉我哪些属性是主键和外键?
目前,我们不考虑复合关键字段。
答案 0 :(得分:0)
查看自动生成的代码,我可以看到生成的类中的原始属性有几个属性,其中有一个EdmScalarPropertyAttribute
,它有一个布尔EntityKeyProperty
,似乎表示是否或不是财产是关键。
如何阅读属性的值在这里的文章中描述:http://msdn.microsoft.com/en-us/library/71s1zwct.aspx
我敢打赌,我可以找到一个关于如何处理外键的一致模式!
答案 1 :(得分:0)
我在Repository中对这些问题的支持部分很少。 请参阅下面的GetEntityKeyFields方法 我没有已经写过FK的检查例程,但是如果你检查了entityField的详细信息,它也会在那里。
public DbEntityEntry<T> Entry(T entity) { return Context.Entry(entity); }
public DbSet<T> EntityDbSet() { return Context.Set<T>(); } // cant be in core interface since it is EF types
public ObjectContext ObjectContext { get { return ((IObjectContextAdapter) this.Context).ObjectContext; } }
// cant be in core interface since it is EF types
public BosBaseDbContext Context { get; protected set; }
public EntityState GetEntityState(T entity) { return Context.Entry(entity).State; }
public ObjectSet<T> GetObjectSet() { return ObjectContext.CreateObjectSet<T>(); }
public string[] GetEntityFields() { return GetObjectSet().EntitySet.ElementType.Properties.Select(e => e.Name).ToArray(); }
public string[] GetEntityKeyFields() { return GetObjectSet().EntitySet.ElementType.KeyMembers.Select(k => k.Name).ToArray(); }
public EntityKey GetEntityKey(T entity) {
if (entity == null) {
return null;
}
return ObjectContext.CreateEntityKey(GetObjectSet().EntitySet.Name, entity);
}