Может ли Entity Framework 4 работать с двумя разными источниками данных? - PullRequest
0 голосов
/ 05 сентября 2011

Во-первых, немного контекста

У меня есть одно настольное приложение, которое использует базу данных Paradox, и я разрабатываю новое приложение ASP.NET с использованием SQL Server для замены текущего рабочего стола.приложение.

Переход будет происходить в три этапа.Первая версия веб-приложения будет использовать SQL Server и Paradox одновременно.Данные об унаследованных объектах будут поступать из Paradox, а данные о новых объектах - из SQL Server.Таким образом, настольная и веб-версии приложения могут использоваться взаимозаменяемо.

На втором этапе все данные из Paradox будут импортированы в SQL Server.Старое настольное приложение (и Paradox db) больше не будет использоваться.

Теперь технический вопрос

Представьте простую модель с двумя сущностями:

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.

Затем я создаю хранилище для клиентов с базовым OleDbConnection с использованием поставщика Paradox.Конечно, Entity Framework по-прежнему создает таблицу «Клиенты» в SQL Server, поскольку у пользователя есть свойство «Клиент».

Затем я удалил отношение базы данных (FK) между пользователем и клиентом.Теперь я могу вставить пользователя, связанного с клиентом, даже если они находятся в разных базах данных.

Проблема заключается в следующем: когда я пытаюсь получить пользователя из базы данных [например: context.Users.Find (id)] Я могу прочитать идентификатор пользователя и имя, но user.Customer имеет значение null.Я ожидал получить идентификатор клиента через свойство user.Customer.ID , поскольку эти данные находятся в таблице Users в SQL Server.

Собираюсь ли я по правильному пути?Если да, то как EF может принести идентификатор клиента для пользователя?

И если нет, то какой будет хороший подход для этого сценария?Я не хочу показывать свойства внешнего ключа в модели (то есть: я не хочу иметь свойство int CustomerId в сущности User).

Заранее спасибо!

1 Ответ

1 голос
/ 06 сентября 2011

Когда вы обращаетесь к user.MyCustomer, EF выдаст инструкцию select для таблицы Customers, а затем материализует объект Customer. Но в вашем случае таблица пуста или не существует.

Вы можете включить скалярное свойство CustomerID в User class

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...