用EF输入外键和记录时出现问题

本文关键字:问题 记录 EF 输入 | 更新日期: 2023-09-27 18:15:47

我有以下类:

public class Instrument
{
    public int Id { get; set; }
    public string Book { get; set; }
    public string Page { get; set; }
}
public class Order
{
    public int Id { get; set; }
    public string OrderName { get; set; }
    public ICollection<MatchedInstrument> MatchedInstruments { get; set; }
}
public class MatchedInstrument
{
    public int Id { get; set; }
    //public int InstrumentId { get; set; }
    public Instrument Instrument { get; set; }
    public bool IsIncluded { get; set; }
    public string Notes { get; set; }
}

和下面的EF DbContext:

    public class AppContext : DbContext
{
    public DbSet<Instrument> Instruments { get; set; }
    public DbSet<Order> Orders { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Order>().HasKey(o => o.Id)
           .HasMany(o => o.MatchedInstruments)
           .WithMany().Map(m => 
           {
              m.MapLeftKey("orderid");
              m.MapRightKey("selectedmatchid");
              m.ToTable("ordermatchedinstruments");
           });
        modelBuilder.Entity<MatchedInstrument>().HasKey(m => m.Id)
           .HasRequired(m => m.Instrument)
           .WithRequiredPrincipal();
   }
}

注意OrderMatchedInstruments表是一个连接表,它只包含两列:orderid和matchedinstrumentid(与MatchedInstruments表相关)。MatchedInstruments表的模式如下所示:

[dbo].[MatchedInstruments](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [IsIncluded] [bit] NOT NULL,
    [Notes] [varchar](max) NULL,
    [InstrumentId] [int] NOT NULL

这些似乎都可以很好地用于查询数据。我可以查询订单,并包括与之匹配的仪器。

然而,当我尝试添加新的MatchedInstrument到订单时,我得到一个错误告诉我,在MatchedInstrument表中InstrumentId不能为null。

...
// Demo Code - count on non-null objects
var instrument = _context.Instruments.FirstOrDefault(); 
var order = _context.Orders.SingleOrDefault(o => o.Id == 5);
order.MatchedInstruments.Add(new MatchedInstrument() { Instrument = instrument });
_context.SaveChanges();    

这让我认为我需要添加一个InstrumentId属性到MatchedInstrument类。然而,我认为EF在没有外键的情况下工作得很好,只要它遵守适当的命名约定。现在,我拥有Instrument的导航属性这一事实会让我认为它会自动在表中查找InstrumentId,并因此为我填充它。

是这样的情况下,还是我错过了一些关于如何EF处理外键?

用EF输入外键和记录时出现问题

将以下属性添加到模型中的每个ID属性中:

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]

我刚刚让这个工作。我在映射中错误地设置了我的关系。我从使用WithRequiredPrincipal改为如下:

    modelBuilder.Entity<MatchedInstrument>().HasKey(m => m.Id)
       .HasRequired(m => m.Instrument)
       .WithMany().HasForeignKey(m => m.InstrumentId);

不知道为什么我认为我需要使用WithRequiredPrincipal(),但这绝对解决了我的问题。

当我看到你没有发送的仪器,但对象仪器,这是你的问题的原因,因为你的模式有仪器作为一个非空整数,你发送的是整个仪器对象,你只需要确定你真正需要什么数据,然后改变你的代码。

Grettings…荷兰国际集团(Ing)。Jorge pembroriz Bárcenas