2

假设我有一个由实体框架生成的名为Student.

Student具有以下属性:

Id int,
Name, string
Age, int
TeacherId int

进一步假设Id指的是 SQL 中的主键,它标识Student对象所指的学生,并且TeacherId是一个外键,它告诉学生的老师是谁。

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

我怎样才能做到这一点?

如果这不合适,那么实体框架如何告诉我哪些属性是主键和外键?

现在,我们先不考虑复合键字段。

4

2 回答 2

0

查看自动生成的代码,我可以看到生成的类中的原始属性有几个属性,EdmScalarPropertyAttribute其中有一个布尔值EntityKeyProperty,它似乎指示该属性是否是键。

此处的文章中描述了如何读取属性的值:http: //msdn.microsoft.com/en-us/library/71s1zwct.aspx

我敢打赌,我也可以找到一个一致的模式来处理外键!

于 2013-07-25T19:20:29.740 回答
0

对于此类问题,我在存储库中几乎没有支持部分。 请参阅下面的 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);
    }
于 2013-07-26T04:04:10.957 回答