0

3 つの異なるクラスと、異なる種類のアドレスを格納する 1 つの基本クラスを作成しました。基本クラスは、User (現在の住所が添付されている) と Post に関連する郵便番号で、郵便番号と都市に関する情報が含まれています。

public class PostalAddress
{
    public virtual User User { get; set; }
    public DateTime LastUsed { get; private set; }

    public string OrientationNumber { get; set; }
    public int UserId { get; set; }

    public int PostId { get; set; }

    public int Id { get; set; }
    public virtual Post Post { get; private set; }

    public string Street  { get; set; }
}

public class Post
{
    public Post()
    {
        InvoicingAddresses = new List<InvoicingAddress>();
        ShippingAddresses = new List<ShippingAddress>();
        UserAddresses = new List<UserAddress>();
    }

    public virtual City City { get; set; }
    public virtual ICollection<InvoicingAddress> InvoicingAddresses { get; private set; }
    public virtual ICollection<ShippingAddress> ShippingAddresses { get; private set; }
    public virtual ICollection<UserAddress> UserAddresses { get; private set; }
    public int CityId { get; set; }
    public int Id { get; set; }
    public string ZipCode { get; set; }   
}

クラス PostalAddress はクラス PostalAddressMap を使用してマップされます

public class PostalAddressMap : EntityTypeConfiguration<PostalAddress>
{
    public PostalAddressMap()
    {
        // Primary Key
        HasKey(t => t.Id);

        // Properties
        // Table & Column Mappings
        ToTable("PostalAddress");
        Property(t => t.Id).HasColumnName("Id");
        Property(t => t.LastUsed).HasColumnName("LastUsed").HasColumnType("datetime2");
        Property(t => t.OrientationNumber).HasColumnName("OrientationNumber");
        Property(t => t.UserId).HasColumnName("UserId");
        Property(t => t.PostId).HasColumnName("PostId");
        Property(t => t.Street).HasColumnName("Street");            

        // Relationships
        HasRequired(t => t.Post).WithMany(t => t.InvoicingAddresses).HasForeignKey(d => d.PostId);
        HasRequired(t => t.User)
            .WithMany(t => t.UserAddressess)
            .HasForeignKey(d => d.UserId);


    }
}

クラス InvoicingAddress、ShippingAddress、および UserAddress は、階層ごとのテーブルアプローチを使用して PostalAddress クラスから継承されます。線を使って関係を設定したい場合

        HasRequired(t => t.Post).WithMany(t => t.InvoicingAddresses).HasForeignKey(d => d.PostId);

コンパイラ エラーが表示されます 型 'System.Collections.Generic.ICollection<InvoicingAddress>' を 'System.Collections.Generic.ICollection<PostalAddress>' に暗黙的に変換できません。明示的な変換が存在します (キャストがありませんか?)

PostalAddress 子クラスと他の TPT タイプとの間に外部キーを設定する方法を教えてください。

役立つ回答をありがとうございます。

4

1 に答える 1

1

PostIdおよびPostプロパティを基本クラスPostalAddressから派生クラスなどに移動する必要がありますInvoicingAddress...

public class InvoicingAddress : PostalAddress
{
    //...
    public int PostId { get; set; }
    public virtual Post Post { get; private set; }
}

...そして、派生クラスのマッピングを使用します。

public class InvoicingAddressMap : EntityTypeConfiguration<InvoicingAddress>
{
    public InvoicingAddressMap()
    {
        HasRequired(t => t.Post)
            .WithMany(t => t.InvoicingAddresses)
            .HasForeignKey(d => d.PostId);
    }
}

Postまたは、基本クラスに単一のコレクションを使用する必要があります。

public virtual ICollection<PostalAddress> Addresses { get; private set; }

その後、元のマッピングを使用できます。

後者のアプローチの欠点は、熱心な読み込みまたは遅延読み込みを使用すると、すべてのPostalAddresses が読み込まれ、読み込むアドレスのタイプを制御できないことです。ただし、アドレスがロードされた後、メモリ内のタイプでフィルタリングできます。

var invoicingAddresses = post.Addresses.OfType<InvoicingAddress>();

明示的な読み込みを使用すると、次のようにフィルター処理することもできます。

var post = context.Posts.Single(p => p.Id == 1);
context.Entry(post).Collection(p => p.Addresses).Query()
    .OfType<InvoicingAddress>().Load();

...これにより、AddressesコレクションにInvoicingAddresses のみが入力されます。

于 2012-10-29T15:56:19.003 に答える