1

私のドメインクラスには次のものがあります(簡略化)

public enum JobType
{
    SalesOrder = 1,
    StockOrder = 2
}
public class SalesOrder : LoggedEntity
{
    public string Name { get; set; }  // and other fields


}
public class StockOrder : LoggedEntity
{
    public string Name { get; set; }  // and other fields


}

public class Job : LoggedEntity
{
  public int JobType { get; set; } // jobtype enum
  public virtual LoggedEntity LinkedEntity { get; set; }
}

私の文脈は次のとおりです。

public class Context : DbContext
{
 public DbSet<Job> Jobs { get; set; }
 public DbSet<StockOrder> StockOrders { get; set; }
 public DbSet<SalesOrder> SalesOrders { get; set; }
 }

移行を実行すると、[ここ] [1]で説明されているエラーが発生します。したがって、抽象エンティティの使用は機能しないようです。

私の質問は、複数のエンティティタイプに移動できるナビゲーションプロパティを作成するにはどうすればよいですか?

JobType = SalesOrderの場合は販売注文に移動し、JobType=StockOrderの場合は在庫注文に移動します。

階層ごとのテーブル戦略を使用したかった[ここでTPHを参照][2]

4

2 に答える 2

1

秘訣は、EFがLoggedEntityクラスを認識しないようにすることです。この例に従ってエンティティを改造します。

public enum JobType
{
  SalesOrder = 1,
  StockOrder = 2
}

public abstract class LoggedEntity
{
  public int Id { get; set; }
  public string Name { get; set; }  // and other fields
}

public abstract class BaseOrder : LoggedEntity // New base class for orders!!
{ }

public class SalesOrder : BaseOrder
{ }

public class StockOrder : BaseOrder
{ }

public class Job : LoggedEntity
{
  public JobType JobType { get; set; } // jobtype enum
  public virtual BaseOrder Order { get; set; }
}

public class Tph2Context : DbContext
{
  public DbSet<Job> Jobs { get; set; }
  public DbSet<BaseOrder> Orders { get; set; }
}

移行により、JobsとBaseOrders(名前は改善される予定)の2つのテーブルが作成されることがわかります。Job現在、aまたは。Orderのいずれかになり得るプロパティがあります。SalesOrderStockOrder

特定の注文タイプをクエリできます

contex.Orders.OfType<StockOrder>()

そして、EFが知らないことに気付くでしょうLoggedEntity

context.Set<LoggedEntity>()

例外をスローします

エンティティタイプLoggedEntityは、現在のコンテキストのモデルの一部ではありません。

于 2013-03-23T23:08:10.043 に答える
0
 how do I create a navigation property that can navigate 
 to more than one entity type?

そうすることはできません。少なくとも今ではない。ナビゲーション プロパティは、エンティティ間の関係を記述する方法です。せいぜい、それらはある種のSQL関係を表しています。そのため、そのような関係をその場で変更または定義することはできません。事前に定義する必要があります。

これを行うには、個別の条件に対して個別のナビゲーション プロパティを定義する必要があります。

public class Job : LoggedEntity
{
  public int JobTypeSales { get; set; } 
  public int JobTypeStock { get; set; }

  public virtual SalesOrder SalesOrder { get; set; }
  public virtual StockOrder StockOrder { get; set; }
}

modelbuilder次に、流暢な API を介して構成でそれらをリンクします。

     HasRequired(s => s.SalesOrder)
                .WithMany()
                .HasForeignKey(s => s.JobTypeSales).WillCascadeOnDelete(true);

     HasRequired(s => s.StockOrder)
                .WithMany()
                .HasForeignKey(s => s.JobTypeStock).WillCascadeOnDelete(true);

as for your error "Sequence Contains No Elements"

このエラーは、指定した Linq クエリがまたはまたは のいずれ.First()かを使用しており、クエリがデータを返さなかった場合に発生します。.Single().ToList()

そのため、使用を避けるには、.FirstOrDefault()またはSingleOrDefault().

明らかに適切なヌルチェックを使用します。

于 2013-03-23T20:55:04.710 に答える