问题描述
我正在尝试创建一对多地图,我尝试了很多方法来做到这一点,但是我还没有弄清楚:/
我有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 key
和navigation 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 key
和navigation 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();
}