在ADO.NET实体模型之间动态切换

时间:2011-11-03 14:06:50

标签: c# asp.net ado.net

这是vsnet 2010中的.net 4.我有多个具有相同结构的数据库。我们最终将它们合并为一个,但这样就行了。我正在编写一个应用程序并且不必编写相同的代码10次,我想在模型之间动态切换。我很近但不太相似。继承人我所拥有的:

using esOrderHeader = Shipping.Models.esShip.OrderHeader;

using fnOrderHeader = Shipping.Models.fnShip.OrderHeader; //OrderHeader is a table in the database

    ObjectContext context = null;

    IEnumerable< EntityObject> orderHeader = null; //i've tried ObjectSet as well

    switch (client)
    {

         case "es":
                  context = new esshipEntities();
                  orderHeader = context.CreateObjectSet<esOrderHeader>();
                  break;

         case "fn":
                  context = new fnshipEntities();
                  orderHeader = context.CreateObjectSet<fnOrderHeader>();
                  break;

    }

var query = from row in orderHeader where row.IsFulfilled == false select row;

以下不会编译,因为编译器说“无法解析符号IsFulfilled”,这是我表中的一个字段。如何在实体之间切换并能够对它们运行linq查询?

2 个答案:

答案 0 :(得分:2)

什么可以帮助您使代码编译(虽然我不确定它是否是一个很好的解决方案:)),为不同的船只制作OrderHeaders的超类。

namespace Shipping.Models
{
    class CommonOrderHeader
    {
        public bool IsFulfilled { get; set; }
    }
}

namespace Shipping.Models.fnShip
{
    class OrderHeader : CommonOrderHeader
    {

    }
}

namespace Shipping.Models.esShip
{
    class OrderHeader : CommonOrderHeader
    {

    }
}

这样,您使用IEnumerable<EntityObject> orderHeader = null;

代替IEnumerable<CommonOrderHeader> orderHeader = null;

由于EntityObject不包含属性IsFulfilled,因此您的代码无法编译。 CommonOrderHeader包含此字段,因此,您的代码会进行编译。

希望你能让它发挥作用:)

答案 1 :(得分:0)

代码对我来说没问题......你能检查一下实体的“IsFulfilled”属性是否正确映射到数据库表吗? “Orderheader”实际上应该是一个Ienumerable ..这是你写的linq查询对...的权限?我唯一能想到的是对象是否正确映射?另外,两个单独的edmx文件中的esshintntities和fnshipentities ??