Рассмотрим сущности Base
, club
и Transfer
ниже:
Base
:
namespace ProjetoFutBr.Domain.Entities
{
public abstract class BaseEntity
{
public virtual string Name { get; set; }
}
}
Club
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjetoFutBr.Domain.Entities
{
public class Club : BaseEntity
{
public int IdClub { get; set; }
public int Division { get; set; }
public List<string> Competicoes { get; set; }
public decimal Income { get; set; }
public string Stadium { get; set; }
}
}
Transfer
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjetoFutBr.Domain.Entities
{
public class Transfer
{
public int TransferId { get; set; }
public string TypeTransfer { get; set; }
public decimal? TransferValue { get; set; }
public DateTime TransferDate { get; set; }
public int OriginClub { get; set; }
public int DestinationClub { get; set; }
public virtual Club Club { get; set; }
public int PlayerTraded { get; set; }
public virtual Player Player { get; set; }
}
}
Мне нужно сделать сопоставление переноса, чтобы и свойство OriginClub
, и свойство DestinationClub
указывали на ClubId
. Я делаю следующую конфигурацию в TransferConfiguration
:
using ProjetoFutBr.Domain.Entities;
using System;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjetoFutBr.Infra.Data.Mapping
{
public class TransferConfiguration : EntityTypeConfiguration<Transfer>
{
public TransferConfiguration()
{
HasKey(t => t.TransferId);
Property(t => t.TypeTransfer)
.IsRequired();
HasRequired(t => t.Club)
.WithMany()
.HasForeignKey(t => t.OriginClub);
HasRequired(t => t.Club)
.WithMany()
.HasForeignKey(t => t.DestinationClub);
HasRequired(t => t.Player)
.WithMany()
.HasForeignKey(t => t.PlayerTraded);
}
}
}
Однако, когда я обновляю базу данных, только DestinationClub
помечается как ForeignKey, который указывает на ClubId
, и мне нужно ClubId
для быть ссылаться также. Как я могу также пометить это свойство как ForeignKey? Есть ли более элегантный способ изобразить это бизнес-правило (у трансфера есть клуб назначения и клуб-источник)?
Я приведу ниже контекстный класс и конфигурацию сущности клубов:
ClubConfiguration
:
using ProjetoFutBr.Domain.Entities;
using System;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjetoFutBr.Infra.Data.Mapping
{
public class ClubConfiguration : EntityTypeConfiguration<Club>
{
public ClubConfiguration()
{
HasKey(c => c.IdClub);
Property(c => c.Name)
.IsRequired();
Property(c => c.Division)
.IsRequired();
}
}
}
ProjetoFutBr
:
using ProjetoFutBr.Domain.Entities;
using ProjetoFutBr.Infra.Data.Mapping;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjetoFutBr.Infra.Data.Context
{
public class ProjetoFutBrContexto : DbContext
{
public ProjetoFutBrContexto()
: base("ProjetoFutBr")
{
}
public DbSet<Club> Clubs { get; set; }
public DbSet<Player> Players { get; set; }
public DbSet<Transfer> Transfers { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
modelBuilder.Properties()
.Where(p => p.Name == p.ReflectedType.Name + "Id")
.Configure(p => p.IsKey());
modelBuilder.Configurations.Add(new ClubConfiguration());
modelBuilder.Configurations.Add(new PlayerConfiguration());
modelBuilder.Configurations.Add(new TransferConfiguration());
}
}
}