0

まず、少しコンテキスト

Paradoxデータベースを使用するデスクトップアプリケーションが1つあり、SQLServerを使用して現在のデスクトップアプリを置き換える新しいASP.NETアプリケーションを開発しています。

移行はフェーズで行われます。Webアプリの最初のバージョンは、SQLServerとParadoxを同時に使用します。レガシーエンティティのデータはParadoxから取得され、新しいエンティティのデータはSQLServerから取得されます。そのため、アプリのデスクトップバージョンとWebバージョンは同じように使用できます。

第2フェーズでは、ParadoxからのすべてのデータがSQLServerにインポートされます。古いデスクトップアプリ(およびParadox db)は使用されなくなります。

さて、技術的な質問

2つのエンティティを持つ単純なモデルを想像してみてください。

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; }
}

両方のエンティティにSQLServerのみを使用すると、すべてが正常に機能します。しかし、今度はParadoxから顧客データを取得し、SQLServerからユーザーデータを取得したいと思います。

次に、Paradoxプロバイダーを使用して、基盤となるOleDbConnectionを使用して、顧客用のリポジトリを作成します。もちろん、UserにはCustomerプロパティがあるため、EntityFrameworkはSQLServerにCustomersテーブルを作成します。

次に、ユーザーと顧客の間のデータベース関係(FK)を削除しました。これで、顧客が異なるデータベースにある場合でも、顧客に関連するユーザーを挿入できるようになりました。

問題は次のとおりです。dbからユーザーを取得しようとすると[例:context.Users.Find(id)]ユーザーのIDと名前を読み取ることはできますが、user.Customerはnullです。このデータはSQLServerのUsersテーブルにあるため、 user.Customer.IDプロパティを介して顧客IDを取得することを期待していました。

私は正しい道を進んでいますか?もしそうなら、EFはどのようにしてユーザーの顧客IDをもたらすことができますか?

そうでない場合、このシナリオの良いアプローチは何でしょうか?モデル内の外部キープロパティを公開したくない(つまり、Userエンティティにint CustomerIdプロパティを含めたくない)。

前もって感謝します!

4

1 に答える 1

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次に、の代わりにを使用して顧客IDプロパティにアクセスできますuser.Customer.ID

于 2011-09-06T00:19:54.603 に答える