複雑な型をEFコアにマップする方法はありますか

.net .net-core c# entity-framework-core

質問

EFコアは、複合型マッピングをサポートしていません。

もし私が次のようなオブジェクトを持っていたら:

public class Entity { 
    public string StringProp {get; set;}
    public SubEntity NestedEntity {get; set;}
}

ここで、SubEntityは:

public class SubEntity{
    public int IntProp {get; set;}
}

これをStringPropとIntPropの列を持つテーブルにどのようにマップできますか?基本的に、テーブルのレコードはEntityとSubEntityの両方のプロパティで構成されています。

SubEntityを無視してエンティティのプロパティを公開しようとしましたが、NestedEntityが無視されたときにそのプロパティを使用するEntityのプロパティに値がないため動作しません。

複合型のすべてのプロパティを持つクラスを作成するか、データベースをリファクタリングする以外の方法はありますか?

受け入れられた回答

関連するすべてのプロパティとすべての必須の表の列にマップされているクラスを使用することに決めました。回避策としてはうまく動作します。 EFコアに複合型のサポートがある場合に更新されます。


人気のある回答

ComplexTypeマッピングは、EF Core 2.0以降で利用可能になりました。これを行うには現在、私が認識している2つの方法があります。

ビア属性

Column属性を指定しないと、Entity Frameworkは、移行せずに既存のテーブルの正しい列にプロパティをマップしません。

たとえば、Address_StreetAddressにマップすることができます

using System.ComponentModel.DataAnnotations.Schema;

public class User
{
    public int Id { get; set; }

    // The complex property we want to use
    public Address Address { get; set; }

    public string UserName{ get; set; }
}

// Lets Entity Framework know this class is a complex type
[ComplexType]
public class Address
{
    // Maps the property to the correct column name
    [Column("Address")]
    public string StreeAddress { get; set; }

    [Column("City")]
    public string City { get; set; }

    [Column("State")]
    public string State { get; set; }

    [Column("Zip")]
    public string ZipCode { get; set; }
}

Via Fluent API

HasColumnNameを指定しないと、Entity Frameworkは、移行を行わずに既存のテーブルの正しい列にプロパティをマップしません。

たとえば、Address_StreetAddressにマップすることができます

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

public class MyContext: DbContext
{
    public DbSet<User> Users{ get; set; }

    public MyContext(DbContextOptions<MyContext> options)
        : base(options) { }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<User>(table =>
        {
            // Similar to the table variable above, this allows us to get
            // an address variable that we can use to map the complex
            // type's properties
            table.OwnsOne(
                x => x.Address,
                address =>
                {
                    address.Property(x => x.City).HasColumnName("City");
                    address.Property(x => x.State).HasColumnName("State");
                    address.Property(x => x.StreetAddress).HasColumnName("Address");
                    address.Property(x => x.SuiteNumber).HasColumnName("SuiteNumber");
                    address.Property(x => x.ZipCode).HasColumnName("Zip");
                });
        });
    }
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ