有沒有辦法用EF Core映射複雜類型

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

EF Core不支持複雜類型映射。

如果我有一個對象,例如:

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並在Entity中公開它的屬性,但這不起作用,因為當忽略NestedEntity時,Entity上使用其屬性的任何屬性都沒有值。

除了創建具有復雜類型的所有屬性或重構數據庫的類之外,還有其他選擇嗎?

一般承認的答案

我決定使用包含所有相關屬性的類,並映射到所有必需的表列。它可以作為一種解決方法。當EF Core中支持複雜類型時,將更新。


熱門答案

從EF Core 2.0開始,ComplexType映射現在可用。我目前有兩種方法可以做到這一點。

通過屬性

不指定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; }
}

通過Fluent API

未指定HasColumnName可能導致實體框架在沒有遷移的情況下不將屬性映射到現有表中的正確列。

例如,它可以映射到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
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow