0

私は次のクラスを持っています

public pratial class Address
{
    public Guid AddressID{ get; set; }
    public AddressType AddressType{ get; set; }
}

public partial class AddressType
{
    public string TypeName{ get; set; }
}

派生した DBContext クラスで、OnModelCreating をオーバーライドしました

protected override OnModelCreating(DBModelBuilder modelBuilder)
{
    modelBuilder.Entity<Address>().HasKey( p => p.AddressID );
    modelBuilder.Entity<Address>().Property ( p => p.AddressID)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    modelBuilder.Entity<Address>().HasRequired( p => p.AddressType);
    modelBuilder.Entity<AddrssType>().HasKey( p => p.TypeName );

    ...
}

これにより、データベースにレコードを入力すると問題が発生します。

データベース内の私のテーブルは最終的にこのようになります

Addresses Table
AddressID (PK, uniqueidentified, not null)
AddressType_TypeName(FK, nvarchar(32), not null)

AddressTypes Table
TypeName (PK, uniqueidentifies, not null)

ここで、いくつかのデータをテーブルに入れます

AddressTypes レコード TypeName ビジネスに入力

Addresses レコード AddressType_TypeName で、Business に入力しました

これで単体テストを実行すると、記録に戻ることを期待しています

List<Address> addresses = context.Addresses.ToList()
Assert.AreEqual(addresses[0].AddressType.TypeName, "Business");

しかし、これはAddressTypeがnullであることを教えてくれません

接続した AddressType を取得できるように、Address と AddressType の関係を設定するにはどうすればよいですか?

4

1 に答える 1

0

関連するエンティティをロードするには、熱心な読み込みを使用して、Entity Framework に伝える必要があります。

using System.Data.Entity;

//...

var addresses = context.Addresses.Include(a => a.AddressType).ToList()

...または、ナビゲーションプロパティを次のようにマークすると、デフォルトで有効になる遅延読み込みvirtualによって:

public virtual AddressType AddressType { get; set; }

一括読み込みでは、親データと関連データが 1 回のデータベース ラウンドトリップで一緒に読み込まれます。遅延読み込みには 2 回のラウンドトリップが必要ですaddresses[0].AddressType.TypeName

編集

プロジェクトをテストして、この例の遅延読み込みが機能することを示します (データベースとして EF 5.0、.NET 4.0、SQL Server Express 2008 R2)。virtualの前だけ入れましたAddressType。残りはあなたのモデルと同じです:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;

namespace EFLazyLoading
{
    public partial class Address
    {
        public Guid AddressID{ get; set; }
        public virtual AddressType AddressType{ get; set; }
    }

    public partial class AddressType
    {
        public string TypeName{ get; set; }
    }

    public class MyContext : DbContext
    {
        public DbSet<Address> Addresses { get; set; }
        public DbSet<AddressType> AddressTypes { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Address>().HasKey( p => p.AddressID );
            modelBuilder.Entity<Address>().Property ( p => p.AddressID)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            modelBuilder.Entity<Address>().HasRequired( p => p.AddressType);
            modelBuilder.Entity<AddressType>().HasKey( p => p.TypeName );
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>());
            using (var ctx = new MyContext())
            {
                var address = new Address
                {
                    AddressType = new AddressType { TypeName = "Business" }
                };
                ctx.Addresses.Add(address);
                ctx.SaveChanges();
            }

            using (var ctx = new MyContext())
            {
                List<Address> addresses = ctx.Addresses.ToList();

                string typeName = addresses[0].AddressType.TypeName;
            }
        }
    }
}

typeName最後の行の結果は期待どおりです。

遅延読み込み

于 2013-04-06T13:35:16.427 に答える