为啥我在设置中收到“'Bars' 不能用作实体类型 'Foo' 的属性”?

Posted

技术标签:

【中文标题】为啥我在设置中收到“\'Bars\' 不能用作实体类型 \'Foo\' 的属性”?【英文标题】:Why I am I getting "'Bars' cannot be used as a property on entity type 'Foo'" in my setup?为什么我在设置中收到“'Bars' 不能用作实体类型 'Foo' 的属性”? 【发布时间】:2021-01-16 17:28:27 【问题描述】:

从概念上讲,我想要实现的相当于

public interface IFoo

    IReadOnlyCollection<Bar> Bars  get; 
    void AddBar(string barName);

即你创建了Bars“虽然”Foo

我有一个相当于

的设置
public class Foo

     public int Id  get; protected set; 

     public IReadOnlyCollection<Bar> Bars => this._bars;
  
     protected readonly List<Bar> _bars;

     protected Foo(Guid id, List<Bar> bars)
     
         this.Id = id;
         this._bars = bars;
     

     // default ctor for ORM
     protected Foo()  

     public static Foo Create(Guid id, params string[] barNames)
     
          var foo = new Foo(id, new List<Bar>());
          foreach (var barName in barNames)
          
              foo.AddBar(barName);
          
          return foo;
     

     public void AddBar(string name)
     
         if (string.IsNullOrWhitespace(name))
         
             throw new ArgumentException("Bar name cannot be emptiness.");
         

         if (this._bars.Any(b => b.Name == name))
         
             throw new InvalidOperationException($"Cannot add bar 'name' as it already is added.");
         

         this._bars.Add(new Bar(Guid.NewGuid(), this, this.Id, name));
     


public class Bar

     public Guid Id  get; protected set; 

     public Foo Foo  get; protected set; 
  
     public Guid FooId  get; protected set; 

     public string Name  get; protected set ; 

     internal Bar(Guid id, Foo foo, Guid fooId, string name)
     
         this.Id = id;
         this.Foo = foo;
         this.FooId = fooId; 
         this.Name = name;
     
 
     // default ctor for ORM
     protected Bar()  

到 SQL 的映射等价于

modelBuilder.Entity<Foo>().ToTable("Foos");
modelBuilder.Entity<Foo>().HasKey(f => f.Id);
modelBuilder.Entity<Foo>().HasMany(f => f.Bars).WithOne(b => b.Foo).HasForeignKey(b => b.FooId);
modelBuilder.Entity<Foo>().Property(f => f.Bars).HasField("_bars");

modelBuilder.Entity<Bar>().ToTable("Bars");
modelBuilder.Entity<Bar>().HasKey(b => b.Id);
modelBuilder.Entity<Bar>().Property(b => b.Name).IsRequired();
modelBuilder.Entity<Bar>().HasOne(b => b.Foo).WithMany(f => f.Bars).HasForeignKey(b => b.FooId);

当我Add-Migration 我得到错误

'Bars' 不能用作实体类型 'Foo' 的属性,因为它是 配置为导航

【问题讨论】:

【参考方案1】:

这个

modelBuilder.Entity<Foo>().Property(f => f.Bars).HasField("_bars");

没有必要,因为 EF 永远不会分配集合导航属性,因此它不需要知道该属性有 Backing Field。

【讨论】:

以上是关于为啥我在设置中收到“'Bars' 不能用作实体类型 'Foo' 的属性”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在尝试设置 PayPal 付款时在生产中不断收到 INVALID_RESOURCE_ID 错误?

为啥我在 Chrome 中运行时在 Android 中收到“无法为 m-section 设置远程视频描述发送参数,mid='0'”错误?

我在 csound 中收到一条错误消息,但我不知道为啥

为啥我在应用程序中收到 sqlcommand 超时?

为啥我在 Android Studio 中收到此错误“Expected resource of type raw”?

为啥我在 iOS 上从 Swift 调用服务时收到 SSL 错误?