实体框架4可以处理两种不同的数据源吗?

时间:2011-09-05 19:47:53

标签: entity-framework foreign-keys code-first hybrid

首先,一点上下文

我有一个使用Paradox数据库的桌面应用程序,我正在使用SQL Server开发一个新的ASP.NET应用程序来替换当前的桌面应用程序。

过渡将在这些阶段发生。 Web应用程序的第一个版本将同时使用SQL Server和Paradox。遗留实体数据将来自Paradox,来自新实体的数据将来自SQL Server。因此,应用程序的桌面版和Web版可以互换使用。

在第二阶段,Paradox的所有数据都将导入SQL Server。旧桌面应用程序(和Paradox数据库)将不再使用。

现在,技术问题

想象一下有两个实体的简单模型:

public class Customer
{
    public Int32 ID { get; set; }
    public String Name { get; set; }

    virtual public IList<User> MyUsers { get; set; }
}

public class User
{
    public Int32 ID { get; set; }
    public String Name { get; set; }

    virtual public Customer MyCustomer { get; set; }
}

public class SqlServerContext : DbContext
{
    public SqlServerContext()
    {
        base.Configuration.ValidateOnSaveEnabled = false;
        base.Configuration.LazyLoadingEnabled = true;
        base.Configuration.ProxyCreationEnabled = true;
        base.Configuration.AutoDetectChangesEnabled = true;
    }
    public DbSet<User> Users { get; set; }
    public DbSet<Customer> Customers { get; set; }
}

当我只为两个实体使用SQL Server时,一切正常。但现在我想从Paradox中检索客户数据并从SQL Server中检索用户数据。

然后,我使用Paradox提供程序为客户创建了一个基础OleDbConnection的存储库。当然,Entity Framework仍然在SQL Server中创建Customers表,因为User具有Customer属性。

然后我删除了User和Customer之间的数据库关系(FK)。现在,我可以插入与客户相关的用户,即使他们位于不同的数据库中。

问题是:当我尝试从db [例如:context.Users.Find(id)]中检索用户时,我可以读取用户的ID和名称,但user.Customer为null。我希望通过 user.Customer.ID 属性获取客户ID,因为此数据位于SQL Server的Users表中。

我要走正确的道路吗?如果是这样,EF如何为用户带来客户ID?

如果没有,对于这种情况,什么是好方法?我不想在模型中公开外键属性(即:我不希望在User实体中有 int CustomerId 属性。)

提前致谢!

1 个答案:

答案 0 :(得分:1)

当您访问user.MyCustomer时,EF会向Customers表发出一个select语句,然后实现Customer个对象。但在您的情况下,表是空的或不存在。

您可以做的是在CustomerID课程中包含标量属性User

public class User
{
    public Int32 ID { get; set; }
    public String Name { get; set; }

    public int? CustomerID { get; set; }//assuming the db column name is also CustomerID
    virtual public Customer MyCustomer { get; set; }
}

然后按如下方式映射关系

public class SqlServerContext : DbContext
{
    public SqlServerContext()
    {
        base.Configuration.ValidateOnSaveEnabled = false;
        base.Configuration.LazyLoadingEnabled = true;
        base.Configuration.ProxyCreationEnabled = true;
        base.Configuration.AutoDetectChangesEnabled = true;
    }
    public DbSet<User> Users { get; set; }
    public DbSet<Customer> Customers { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
       modelBuilder.Entity<User>()
       .HasOptional(u => u.User)
       .WithMany(c => c.MyUsers)
       .HasForeignKey(u => u.CustomerID);

    }
}

然后,您可以使用user.CustomerID代替user.Customer.ID来访问客户ID属性。