Вам необходимо внести некоторые изменения в свой код.
Прежде всего, каждое свойство навигации должно быть помечено как виртуальное, чтобы позволить Entity Framework выполнять отложенную загрузку, если только вы не хотите всегда загружать все ваша навигация (может быть выбор, зависит от вас).
После этого каждый ваш пользователь имеет транзакции outgoing
и incoming
, поэтому для класса User
:
public class User
{
public int userId { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public string CardNumber { get; set; }
public string Password { get; set; }
public int Balance { get; set; }
public string UserType { get; set; }
public string ProfileUrl { get; set; }
public virtual IList<Transaction> IncomingTransactions { get; set; }
public virtual IList<Transaction> OutgoingTransactions { get; set; }
}
Давайте сделаем свойства виртуальной навигации Transaction
class
public class Transaction
{
public Transaction()
{
this.TranscationDateTime = DateTime.UtcNow;
}
public int TransactionId { get; set; }
public int Amount { get; set; }
public virtual User FromUser { get; set; }
public virtual User ToUser { get; set; }
public DateTime TranscationDateTime { get; set; }
}
И последнее, но не менее важное, давайте проинформируем ваш DbContext о том, как вещи должны go:
public class MyContext : DbContext
{
public MyContext(string connectionString) : base(connectionString) { }
public DbSet<User> Users { get; set; }
public DbSet<Transaction> Transactions { get; set; }
protected override void OnModelCreating(DbModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Transaction>()
.HasRequired<User>(t => t.FromUser)
.WithMany(u => u.OutgoingTransactions).WillCascadeOnDelete(false);
builder.Entity<Transaction>()
.HasRequired<User>(t => t.ToUser)
.WithMany(u => u.IncomingTransactions).WillCascadeOnDelete(false);
}
}
Этого должно быть достаточно для автоматического обнаружения EF, чтобы сделать правильные предположения и создать правильную структуру базы данных, то есть два FK в таблице транзакций, каждый из которых является первичным ключом таблицы Users.
И вуаля: