0

EFで正しくマップしたい次のクラスがあります。

internal class Wallet : EntityFrameworkEntity
{
    public Wallet()
    {
        this.Requests = new List<FinancialRequest>();
    }

    public string Name { get; set; }
    public string Description { get; set; }
    public decimal CurrentBalance { get; set; }
    public decimal BlockedBalance { get; set; }

    public virtual ICollection<Paper> Papers { get; set; }

    public virtual ICollection<FinancialRequest> Requests { get; set; }

    public virtual User Manager { get; set; }

}

internal class Request : EntityFrameworkEntity
{
    public Int64 UserId { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime UpdatedAt { get; set; }
    public RequestStatus Status { get; set; }

    public virtual User User { get; set; }
}

internal class FinancialRequest : Request
{
    public DateTime ValidUntil { get; set; }
    public FinancialRequestType RequestType { get; set; }
    public int Quantity { get; set; }
    public bool UseMarketValue { get; set; }
    public decimal? Value { get; set; }

    public virtual Wallet Source { get; set; }
    public virtual Wallet Destination { get; set; }
    public virtual Team Team { get; set; }
}

私は Code First を使用しているので、これらのクラスをマップする方法は次のとおりです。

        modelBuilder.Entity<Wallet>()
                    .HasMany(x => x.Requests)
                    .WithOptional();

        modelBuilder.Entity<Wallet>()
                    .HasMany(x => x.Papers)
                    .WithOptional(x => x.Owner)
                    .Map(configuration => configuration.MapKey("OwnerId"));

        modelBuilder.Entity<Wallet>()
                    .HasMany(x => x.Requests)
                    .WithOptional();

        modelBuilder.Entity<Request>().ToTable("Requests");
        modelBuilder.Entity<FinancialRequest>().ToTable("FinancialRequests");

        modelBuilder.Entity<FinancialRequest>()
                    .HasRequired(x => x.Team)
                    .WithOptional()
                    .Map(configuration => configuration.MapKey("TeamId"));

        modelBuilder.Entity<FinancialRequest>()
                    .HasOptional(x => x.Destination)
                    .WithOptionalDependent()
                    .Map(configuration => configuration.MapKey("DestinationWalletId"));

        modelBuilder.Entity<FinancialRequest>()
                    .HasRequired(x => x.Source)
                    .WithRequiredDependent()
                    .Map(configuration => configuration.MapKey("SourceWalletId"));

このマッピングをそのままにしておくと、データベース スキーマは次のようになります。

間違ったデータベース スキーマ

注意深く見ると、そこにあるはずのない「Wallet_Id」という列があることがわかります。この列は、Wallet クラスに「Requests」コレクションがあるためにのみ存在します。列からコレクションを削除すると消えますが、このコレクションが必要です! クラス間の重要な関係を表します。私が必要としないのは、間違って生成されたデータベースの 3 列目です。

これを回避する方法を知っている人はいますか?ここで何が間違っていますか?

4

1 に答える 1