8

ここで同様の質問をたくさん見つけましたが、どれも私の問題を解決するのに役立たないようです。流暢な API と属性は役に立ちませんでした。データベースは作成されましたが、オブジェクトを追加するとクラッシュしました。それ自体のコレクションを持つクラスが必要です。ここに私が持っているコードがあります:

[Table("UObjects")]
public class UObject
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Browsable(false)]
    public long ID { get; set; }
    public string Name { get; set; }
    [Browsable(false)]
    public long? ParentID { get; set; }

    public virtual UObject UParent { get; set; }
    [Browsable(false)]
    public virtual ICollection<UObject> UObjects { get; set; }
}


public class MyContext : DbContext
{
    public DbSet<UObject> UObjects { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // This fluent API didn't help
        //modelBuilder.Entity<UObject>()
        //        .HasOptional(u => u.UParent)
        //        .WithMany(u => u.UObjects)
        //        .HasForeignKey(u => u.ParentID);

        //modelBuilder.Entity<UObject>()
        //        .HasOptional(u => u.UParent)
        //        .WithMany(u => u.UObjects)
        //        .Map(c =>
        //        {
        //            c.MapKey("ParentID");
        //            c.ToTable("UObjects");
        //        });
    }
}

データベースのレコードは次のようになります。

ID | Name       | ParentID
------------------------------------
1  | First      | 0
2  | SubFirst   | 1
3  | SubSecond  | 1
4  | SubThird   | 2
5  | SubFourth  | 2

したがって、エンティティをロードした後のオブジェクトの外観は次のとおりです。

   - First
      - SubFirst
         - SubThird
         - SubFourth
      - SubSecond

しかし、すべてのオブジェクトには空のコレクションがあります。正しく機能させるにはどうすればよいですか?

4

3 に答える 3

2

あなたのものとほぼ同じエンティティ クラスが EF Core で動作します。プロパティの名前を に変更ParentIDし、UParentIDコンストラクターを追加しました。

[Table("UObjects")]
public class UObject
{
  protected UObject()
  {
    UObjects = new List<UObject>();
  }

  public UObject(UObject parent, string name)
    : this()
  {
    Name = name;
    UParent = parent;
    UParent?.UObjects.Add(this);
  }

  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public long ID { get; set; }
  public string Name { get; set; }
  public long? UParentID { get; set; }

  public virtual UObject UParent { get; set; }
  public virtual ICollection<UObject> UObjects { get; set; }
}

私はこれApplicationDBContextしか持っていません:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<UObject>();
}

使用法 (オブジェクトのプロパティがroot正しい値で満たされる方法を参照してください): イーガーローディング

注: このコードの削除については気にしませんでした。必要な場合は、おそらくさらに複雑になります。

于 2017-01-12T00:31:13.107 に答える
-3
  1. UParent プロパティを ForeignKey 属性と ? で装飾します。null可能になる可能性があるため

[ForeignKey("ParentID")] public virtual UObject? UParent { get; set; }

  1. データベース内: 親が存在しない場合は、ParentId の値を「NULL」に設定します。
于 2017-01-09T13:48:22.720 に答える