如何判断EntityObject的属性是主键还是外键?

时间:2013-07-25 16:44:50

标签: sql entity-framework foreign-keys primary-key

假设我有一个由实体框架生成的类Student

Student具有以下属性:

Id int,
Name, string
Age, int
TeacherId int

进一步假设Id指的是SQL中的主键,用于标识Student个对象引用的学生,TeacherId是一个外键,用于指示学生的教师是谁。< / p>

假设我想编写一个函数,它将任何 EntityObject(例如这个)作为参数,并返回有关哪些属性是主键和外键的信息。

我该怎么做?

如果这不合适,那么Entity Framework如何告诉我哪些属性是主键和外键?

目前,我们不考虑复合关键字段。

2 个答案:

答案 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);
    }