2011-02-18 42 views
4

我需要动态访问一些SQL表,希望使用实体框架。下面是一些伪代码:动态加载实体框架中的SQL表

var Account = DB.Accounts.SingleOrDefault(x => x.ID == 12345);

将返回我的帐户对象,这包含一些领域所谓的“前缀”,“广告系列ID”和有关账户的详细信息都存储在命名单独的SQL表PREFIX_CAMPAIGNID_MAIN的约定。

这些表都具有相同的领域,所以我想创建一个不被任何映射和一个新的实体,然后动态加载它,就像这样:

var STA01_MAIN = new MyAccount(); // my "un-mapped" entity

DB.LoadTable('STA01_MAIN').LoadInto(STA01_MAIN);

我现在可以获得有关STA01_MAIN帐户的任何信息:STA01_MAIN.AccountId

所以我的问题是:如何使用实体框架访问这些表?

+0

您将映射它们,您将直接使用SQL查询它们,否则您将无法访问它们。亚当的答案是正确的。 – 2011-02-18 18:08:49

回答

3

我不认为EF具有可装入和LoadInto方法,但ObjectOntext.ExecuteStoreQuery可能是你在找什么:

http://msdn.microsoft.com/en-us/library/dd487208.aspx

这应该让你对数据库执行任意查询,然后将结果映射到您指定的任意类型(即使它没有以其他方式映射到EF中)。

不言而喻,您将负责将提供必要列的查询放入到目标类型中,并在此类型更改时调整所述查询。

下面是关于它的用法进一步讨论

http://social.msdn.microsoft.com/Forums/en-US/adonetefx/thread/44cf5582-63f8-4f81-8029-7b43469c028d/

你有没有考虑映射所有这些表(有相同的列)到EF继承关系,然后询问他们作为

db.BaseTypes.OfType<SpecificType>().Where(/*.....*/);

+0

+1正确答案。这种继承模型称为Table per Class(TPC)。 – 2011-02-18 18:10:08