通过Fluent API创建EF外键

本文关键字:EF 外键 创建 API Fluent 通过 | 更新日期: 2023-09-27 18:14:40

实体框架在这个特定的场景中没有对我的数据注释变化做出反应,所以我想尝试通过我从未使用过的Fluent API。

我有一个模型"Transfer",它有三个属性-它的Id和"TransferredFromId"answers"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);

通过Fluent API创建EF外键

两种可能,取决于你想从哪一边开始。

首先,你必须在你的上下文中重写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);

这两行中的每一行都应该具有与数据注释映射相同的语义。