EF CORE-创建一对多地图

问题描述

我正在尝试创建一对多地图,我尝试了很多方法来做到这一点,但是我还没有弄清楚:/

我有2个实体,分别是Wallet和Transfer,我想在Transfer中添加一个FK WalletId,所以一个转移只有一个钱包,但是一个钱包可以关联多个转移。

Wallet.cs-

public class Wallet
    {

        public int Id { get; private set; }
        public decimal Balance { get; private set; }
    }

Transfer.cs-

public class Transfer
    {
        #region Properties
        public int Id { get; private set; }
        public decimal Value { get; private set; }
        public DateTime? TransferDate { get; private set; }
        public DateTime RegisterDate { get; private set; }
        public ETransferType TransferType { get; private set; }
    }

WalletMap.cs-

public class WalletMap : IEntityTypeConfiguration<Wallet>
    {
        public void Configure(EntityTypeBuilder<Wallet> builder)
        {
            builder.HasKey(x => x.Id);
            builder.Property(x => x.Balance).HasColumnType("Money").Isrequired();
        }
    }

TransferMap.cs-

public class TransferMap : IEntityTypeConfiguration<Transfer>
    {
        public void Configure(EntityTypeBuilder<Transfer> builder)
        {
            builder.HasKey(x => x.Id);
            builder.Property(x => x.Value).HasColumnType("Money").Isrequired();
            builder.Property(x => x.TransferDate);
            builder.Property(x => x.RegisterDate).Isrequired();
            builder.Property(x => x.TransferType).Isrequired();
        }
    }

解决方法

向Wallet.cs添加:

public virtual ICollection<Transfer> Tranfers { get; set; }

要在Transfer.cs中添加:

public virtual Wallet Wallet { get; set; }

要在TransferMap.cs中添加您的Configure块:

builder.HasRequired(x => x.Wallet).WithMany(x => x.Transfers).Map(x => x.MapKey("WalletId")).WillCascadeOnDelete();

如果尚未在数据库中配置级联删除,则可以删除WillCascadeOnDelete()。假设您已经在数据库的“传输”表中定义了WalletId。

,

添加一个foreign keynavigation property

public class Wallet
{
    public int Id { get; set; }
    public decimal Balance { get; set; }
    public virtual ICollection<Transfer> Transfers { get; set; } // Navigation Property
}

public class Transfer
{
    pubic int Id { get; private set; }
    public decimal Value { get; private set; }
    public Datetime? TransferDate { get; private set; }
    //.....Remaining properties
    public int WalletId { get; set; }  //Foreign Key
    public virtual Wallet Wallet { get; set; }  //Reference Navigation
}

这将添加所需的foreign keynavigation properties

//using fluent api
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Transfer>().HasOne(x => x.Wallet)
        .WithMany(x => x.Transfers)
        .HasForeignKey(x => x.WalletId);
    modelBuilder.Entity<Wallet>.HasMany(x => x.Transfers)
        .WithOne();
}