C# 实体框架核心多对多关系错误:对象引用未设置为对象的实例

C# 实体框架核心多对多关系错误:对象引用未设置为对象的实例,c#,entity-framework-core,C#,Entity Framework Core,我是C#/EF Core新手,不明白为什么会出现空引用异常: System.NullReferenceException HResult=0x80004003 Message=对象引用未设置为对象的实例。 来源=WMS StackTrace: 位于d:\Project Arbeit\Code\WMS\Pages\Artikels\Artikel Verkauf\erfassen.Artikel verkauferfassen.d\uu 33.MoveNext()中的WMS.Pages.Artik

我是C#/EF Core新手,不明白为什么会出现空引用异常:

System.NullReferenceException
HResult=0x80004003
Message=对象引用未设置为对象的实例。
来源=WMS

StackTrace:
位于d:\Project Arbeit\Code\WMS\Pages\Artikels\Artikel Verkauf\erfassen.Artikel verkauferfassen.d\uu 33.MoveNext()中的WMS.Pages.Artikels.Artikel\u verkauferfassen\Artikel verkauferfassen\ArtikelVerkaufErfassen.razor.cs:第44行

我有一个多对多的关系,并试图获得分支机构的文章:

void Add()
{
    var availableQuantity = BranchItems.Find(bi => bi.ArticleId == articleSale.ArticleId)
    .BrancheArticles.Find(ba => ba.ArticleId == articleSale.ArticleId).Quantity;
}
类结构如下所示:

public class ArticleModel
{
    [Key]
    public int ArticleId { get; set; }

    [Required]
    public string ItemNumber { get; set; }

    [Required]
    public string ItemName { get; set; }

    [Required]
    [MaxLength(40)]
    [MinLength(10)]
    public string ArticleDescription { get; set; }

    [Range(50, 10000)]
    [DataType(DataType.Currency)]
    [Column(TypeName = "decimal(18, 2)")]
    public decimal Preis { get; set; }

    [Range(1,100, ErrorMessage = "sollte von 1 bis 100 Stück sein")]
    public int Menge { get; set; }

    public List<BranchArticle> BrancheArticles { get; set; } = new List<BranchArticle>();
}

public class BranchArticle
{
    public int BranchId { get; set; }
   
    public int ArticleId{ get; set; }

    public BranchModel Branch { get; set; } = new BranchModel();

    public ArticleModel Article { get; set; } = new ArticleModel();

    public int Quantity { get; set; }
}

public class BranchModel
{
    [Key]
    public int Id { get; set; }
    public Guid BranchId { get; set; }
    public string BranchCode { get; set; }
    public string BranchName { get; set; }
    public string Street { get; set; }
    public string HouseNr { get; set; }
    public string ZipCode { get; set; }
    public string Location { get; set; }
    public string ContactPerson { get; set; }
    public string TelefoneNr { get; set; }
    public string Email { get; set; }

    public List<BranchArticle> BrancheArticles { get; set; } = new List<BranchArticle>();  
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<BranchArticle>()
        .HasKey(ab => new { ab.BranchId, ab.ArticleId });

    modelBuilder.Entity<BranchArticle>()
        .HasOne<ArticleModel>(ab => ab.Article)
        .WithMany(am => am.BrancheArticles)
        .HasForeignKey(ab => ab.ArticleId);

    modelBuilder.Entity<BranchArticle>()
        .HasOne<BranchModel>(ab => ab.Branch)
        .WithMany(bm => bm.BrancheArticles)
        .HasForeignKey(ab => ab.BranchId);

    modelBuilder.Entity<BranchArticle>(entity => { entity.ToTable(name: "BranchArticles"); });

    base.OnModelCreating(modelBuilder);
}
公共类文章模型
{
[关键]
公共int ArticleId{get;set;}
[必需]
公共字符串ItemNumber{get;set;}
[必需]
公共字符串ItemName{get;set;}
[必需]
[MaxLength(40)]
[秘书长(10)]
公共字符串ArticleDescription{get;set;}
[射程(50,10000)]
[数据类型(数据类型.货币)]
[列(TypeName=“十进制(18,2)”)]
公共十进制Preis{get;set;}
[范围(1100,ErrorMessage=“sollte von 1 bis 100 Stück sein”)]
public int Menge{get;set;}
公共列表分支目录{get;set;}=new List();
}
公共类分支
{
公共整数{get;set;}
公共int ArticleId{get;set;}
public BranchModel Branch{get;set;}=new BranchModel();
public ArticleModel Article{get;set;}=new ArticleModel();
公共整数数量{get;set;}
}
公共类分支模型
{
[关键]
公共int Id{get;set;}
公共Guid{get;set;}
公共字符串分支代码{get;set;}
公共字符串BranchName{get;set;}
公共字符串Street{get;set;}
公共字符串HouseNr{get;set;}
公共字符串ZipCode{get;set;}
公共字符串位置{get;set;}
公共字符串ContactPerson{get;set;}
公共字符串TelefoneNr{get;set;}
公共字符串电子邮件{get;set;}
公共列表分支目录{get;set;}=new List();
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasKey(ab=>new{ab.BranchId,ab.ArticleId});
modelBuilder.Entity()
.HasOne(ab=>ab.Article)
.有许多(am=>am.小枝)
.HasForeignKey(ab=>ab.ArticleId);
modelBuilder.Entity()
.HasOne(ab=>ab.Branch)
.有许多(小枝=>小枝)
.HasForeignKey(ab=>ab.BranchId);
实体(实体=>{Entity.ToTable(名称:“BranchArticles”);});
基于模型创建(modelBuilder);
}

可能其中一个Find函数失败(返回null)

我建议你像这样分解你的代码

var branchItem = BranchItems.Find(bi => bi.ArticleId == articleSale.ArticleId);
if(branchItem == null) {
    // throw an error or print an error message, etc...
} else {
    var article = branchItem.BrancheArticles.Find(ba => ba.ArticleId == articleSale.ArticleId);
    if (article == null) {
        // throw an error or print an error message, etc...
    } else { 
        var quantity = article.Quantity;
    }
}

您还可以考虑使用Where()+SingleOrDefault()而不是Find()。

哪一行抛出错误?*var availablequality=BranchItems.Find(bi=>bi.ArticleId==articleSale.ArticleId)--->给出正确的值
.branchericles.Find(ba=>ba.ArticleId==articleSale.ArticleId)。数量;--->谢谢你的帮助。问题是,我并没有为上下文中的急切加载添加逻辑。我错过了“包括”。解决方案是:
return await\u wmsDBContext.Articles.Where(谓词).Include(a=>a.branchericles.toListSync();这就是为什么我建议你使用Where()而不是Find(),但我不想深陷其中。如果使用Where(),Linq将延迟加载丢失的数据。