Entity Framework Core에서 [ComplexType] 사용

asp.net-core-mvc entity-framework-core

문제

EF 핵심 데이터 모델 내 자신의 클래스의 속성을 사용하고 있습니다.

public class Currency
{
    public string Code { get; set; }
    public string Symbol { get; set; }
    public string Format { get; set; }
}

[ComplexType]
public class Money
{
    public int? CurrencyID { get; set; }
    public virtual Currency Currency { get; set; }
    public double? Amount { get; set; }
}

public class Rate
{
    public int ID { get; set; }
    public Money Price = new Money();
}

내 문제는 마이그레이션을 만들려고 할 때 EF Core가 오류를보고한다는 것입니다.

public class Currency
{
    public string Code { get; set; }
    public string Symbol { get; set; }
    public string Format { get; set; }
}

[ComplexType]
public class Money
{
    public int? CurrencyID { get; set; }
    public virtual Currency Currency { get; set; }
    public double? Amount { get; set; }
}

public class Rate
{
    public int ID { get; set; }
    public Money Price = new Money();
}

키를 선언하면 "Money"에 대한 별도의 테이블이 만들어집니다. 이는 내가 찾고있는 것이 아닙니다.

EF 코어에서 ComplexType을 사용하여 단일 테이블에 모든 것을 넣을 수있는 방법이 있습니까?

수락 된 답변

복잡한 유형에 대한 지원은 현재 백 로그에 있습니다. https://github.com/aspnet/EntityFramework/issues/246


인기 답변

위의 의견 중 하나를 기반으로하는 업데이트로 DbContext의 OnModelCreating 함수에서 Fluent API를 사용하여 OwnsOne 구문을 사용합니다.

[ComplexType]
public class Money
{
    public double? Amount { get; set; }
}

public class Rate
{
    [Key]
    public long Id { get; set; }

    public Money Price { get; set; }
}

public MyDbContext : DbContext
{
     protected override void OnModelCreating(ModelBuilder modelBuilder)
     {
         modelBuilder.Entity<Rate>(entity =>
         {
             entity.OwnsOne(e => e.Currency);
         });
     }
}

실제로 ComplexTypeAttribute 사용하는지 여부는 확실하지 않습니다. 그러나 Add-Migration을 통해 마이 그 레이션을 생성하면 이전 ComplexType 문서에 대해 예상대로 생성됩니다 (즉, Rate 라는 테이블에 Price_Amount 열이 Price_Amount ).




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.