C# 通过Fluent API创建EF外键

C# 通过Fluent API创建EF外键,c#,entity-framework,C#,Entity Framework,在这个特定场景中,Entity Framework不会对我的数据注释更改做出反应,所以我想尝试使用我从未使用过的Fluent API 我有一个模型“Transfer”,它有三个属性——它的Id和“TransferredFromId”以及“TransferredToId”属性,它们表示参与传输的用户(另一个EF模型)。像这样: public class Transfer { public long Id { get; set; } public long TransferredF

在这个特定场景中,Entity Framework不会对我的数据注释更改做出反应,所以我想尝试使用我从未使用过的Fluent API

我有一个模型“Transfer”,它有三个属性——它的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; }
}
如何通过Fluent API实现完全相同的功能

为了澄清,我希望有一个传输表,它有两个属性,这两个属性都表示用户表中的Id


临时编辑:当我切换到Fluent API时,我的模型应该是这样吗

public class Transfer
{
    public long Id { get; set; }

    public long TransferredFromId { get; set; }

    public long TransferredToId { 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);
modelBuilder.Entity().HasRequired(x=>x.TransferredFrom)。带有多个(x=>x.TransferredFroms)。HasForeignKey(x=>x.TransferredFrom id);
modelBuilder.Entity().HasRequired(x=>x.TransferredTo)。WithMany(x=>x.TransferredTos)。HasForeignKey(x=>x.TransferredToId);

两种可能性,取决于您想从哪一侧开始

首先,必须在上下文中重写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().HasRequired(x=>x.TransferredFrom)。带有多个(x=>x.TransferredFroms)。HasForeignKey(x=>x.TransferredFrom id);
modelBuilder.Entity().HasRequired(x=>x.TransferredTo)。WithMany(x=>x.TransferredTos)。HasForeignKey(x=>x.TransferredToId);

modelBuilder.Entity().HasMany(x=>x.TransferredFroms).WithRequired(x=>x.TransferredFrom).HasForeignKey(x=>x.TransferredFromId);
modelBuilder.Entity().HasMany(x=>x.TransferredTos).WithRequired(x=>x.TransferredTo).HasForeignKey(x=>x.TransferredToId);

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

两种可能性,取决于您希望从哪一侧开始

首先,必须在上下文中重写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().HasRequired(x=>x.TransferredFrom)。带有多个(x=>x.TransferredFroms)。HasForeignKey(x=>x.TransferredFrom id);
modelBuilder.Entity().HasRequired(x=>x.TransferredTo)。WithMany(x=>x.TransferredTos)。HasForeignKey(x=>x.TransferredToId);

modelBuilder.Entity().HasMany(x=>x.TransferredFroms).WithRequired(x=>x.TransferredFrom).HasForeignKey(x=>x.TransferredFromId);
modelBuilder.Entity().HasMany(x=>x.TransferredTos).WithRequired(x=>x.TransferredTo).HasForeignKey(x=>x.TransferredToId);

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

两种可能性,取决于您希望从哪一侧开始

首先,必须在上下文中重写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().HasRequired(x=>x.TransferredFrom)。带有多个(x=>x.TransferredFroms)。HasForeignKey(x=>x.TransferredFrom id);
modelBuilder.Entity().HasRequired(x=>x.TransferredTo)。WithMany(x=>x.TransferredTos)。HasForeignKey(x=>x.TransferredToId);

modelBuilder.Entity().HasMany(x=>x.TransferredFroms).WithRequired(x=>x.TransferredFrom).HasForeignKey(x=>x.TransferredFromId);
modelBuilder.Entity().HasMany(x=>x.TransferredTos).WithRequired(x=>x.TransferredTo).HasForeignKey(x=>x.TransferredToId);

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

两种可能性,取决于您希望从哪一侧开始

首先,必须在上下文中重写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().HasRequired(x=>x.TransferredFrom)。带有多个(x=>x.TransferredFroms)。HasForeignKey(x=>x.TransferredFrom id);
modelBuilder.Entity().HasRequired(x=>x.TransferredTo)。WithMany(x=>x.TransferredTos)。HasForeignKey(x=>x.TransferredToId);

modelBuilder.Entity().HasMany(x=>x.TransferredFroms).WithRequired(x=>x.TransferredFrom).HasForeignKey(x=>x.TransferredFromId);
modelBuilder.Entity().HasMany(x=>x.TransferredTos).WithRequired(x=>x.TransferredTo).HasForeignKey(x=>x.TransferredToId);

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

谢谢您的回答。我似乎理解第二种选择,但不理解第一种。在第一个表中,它指向用户表的什么位置?另外,我应该在原始模型中保留什么?我临时编辑了我的问题以解释我的意思。您的导航属性指向用户表,即TransferredFrom、TransferredTo。您应该将这些导航属性保留在模型中,也保留反向属性。但是可以删除数据注释。如果您想使用较少的导航属性,您可以跳过用户表中的一个,如果您同时删除这两个属性,EF将对使用哪个键感到困惑哪个导航属性(即使您正确配置)谢谢您的回答。我似乎理解第二种选择,但不理解第一种。在第一个表中,它指向用户表的什么位置?另外,我应该在原始模型中保留什么?我临时编辑了我的问题以解释我的意思。您的导航属性指向用户表,即TransferredFrom、TransferredTo。您应该将这些导航属性保留在模型中,也保留反向属性。但是可以删除数据注释。如果您想使用较少的导航属性,您可以跳过用户表中的一个,如果您同时删除这两个属性,EF将对使用哪个键感到困惑哪个导航属性(即使您正确配置)谢谢您的回答。我似乎理解第二种选择,但不理解第一种。在第一个表中,它指向用户表的什么位置?另外,我应该在原始模型中保留什么?我临时编辑了我的问题以解释我的意思。您的导航属性指向用户表格