首先,一点上下文
我有一个使用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 属性。)
提前致谢!
答案 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属性。