实体框架对此特定场景中的数据注释更改没有反应,因此我想尝试使用Fluent API,这是我从未使用过的。
我有一个模特"转移"它有三个属性 - 它的Id和" TransferredFromId"和" TransferredToId"属性,表示传输中涉及的用户(另一个EF模型)。像这样:
public class Transfer
{
public long Id { get; set; }
public long TransferredFromId { get; set; }
[ForeignKey("TransferredFromId")]
public User TransferredFrom { get; set; }
public long TransferredToId { get; set; }
[ForeignKey("TransferredToId")]
public User TransferredTo { get; set; }
}
用户模型目前如下所示:
public class User
{
public long Id { get; set; }
[InverseProperty("TransferredFrom")]
public ICollection<Transfer> TransferredFroms { get; set; }
[InverseProperty("TransferredTo")]
public ICollection<Transfer> TransferredTos { get; set; }
}
注意 - 我认为用户看起来像这样,它仍然可以工作:
public class User
{
public long Id { get; set; }
}
如何通过Fluent API实现完全相同的功能?
为了澄清,我希望有一个包含两个属性的转移表,它们都代表Users表中的Id。
临时编辑:当我切换到Fluent API时,我的模型应该是这样的吗?
public class Transfer
{
public long Id { get; set; }
public long TransferredFromId { get; set; }
public long TransferredToId { get; set; }
}
和
public class User
{
public long Id { get; set; }
}
然后在上下文中添加它?
modelBuilder.Entity<Transfer>().HasRequired(x => x.TransferredFrom).WithMany(x => x.TransferredFroms).HasForeignKey(x => x.TransferredFromId);
modelBuilder.Entity<Transfer>().HasRequired(x => x.TransferredTo).WithMany(x => x.TransferredTos).HasForeignKey(x => x.TransferredToId);
答案 0 :(得分:3)
两种可能性,取决于您想要开始的那一方。
首先,您必须覆盖上下文中的OnModelCreating()方法。
您的两个选项应如下所示:
modelBuilder.Entity<Transfer>().HasRequired(x=>x.TransferredFrom).WithMany(x=>x.TransferredFroms).HasForeignKey(x=>x.TransferredFromId);
modelBuilder.Entity<Transfer>().HasRequired(x=>x.TransferredTo).WithMany(x=>x.TransferredTos).HasForeignKey(x=>x.TransferredToId);
和
modelBuilder.Entity<User>().HasMany(x=>x.TransferredFroms).WithRequired(x=>x.TransferredFrom).HasForeignKey(x=>x.TransferredFromId);
modelBuilder.Entity<User>().HasMany(x=>x.TransferredTos).WithRequired(x=>x.TransferredTo).HasForeignKey(x=>x.TransferredToId);
这两行中的每一行都应该与数据注释映射具有相同的语义。