4

データベースに格納したいサイズの範囲の値の 2D 配列があります (ただし、必要に応じて大きな固定サイズを作成できます)。誰でもこれを行うための最良の方法を教えてもらえますか?

4

1 に答える 1

4

私には、2D 配列は のように聞こえ(x,y) = somevalueます。だから私は、このような単純なものを考えています( が であると仮定しsomevalueますint):

public interface IArrayValueEntity
{    
    int ArrayIndexX { get; set; }
    int ArrayIndexY { get; set; }
    int Value { get; set; }
}

エンティティ タイプは次のように実装します (または、必要に応じて実装のみを使用することもできます)。

public class ArrayValue : IArrayValueEntity
{
    public int ArrayIndexX { get; set; }
    public int ArrayIndexY { get; set; }
    public int Value { get; set; }
}

次に、コードファーストにする場合は、メソッドをオーバーライドしてArrayIndexXArrayIndexYエンティティの主キーを作成し、これらの 2 つの値の組み合わせの一意性を EF に強制させることができます。OnModelCreatingDbContext

public class MyDbContext : DbContext
{
    public IDbSet<ArrayValue> ArrayValues { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
         // there are several options here...
    }
}

最初からデータベースがない場合は、エンティティの構成方法に基づいて、EF がデータベースを作成できます (私の間違いでなければ、既定で作成されます)。

そして、特定の(x,y)キーの値を取得するサービスや、2D 配列を取得する別のサービスを持つことができます。

編集

マップエンティティの「一部」である 2D 配列に対処するには、ナビゲーション プロパティを定義するだけで済みます。必要に応じて、外部キー プロパティを定義することもできます。

public class Map : IMapEntity
{
    public int Id { get; set; } // primary key
    public string Description { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime? DateUpdated { get; set; }

    // Navigation property on the "one" side (note "virtual ICollection")
    public virtual ICollection<ArrayValue> ArrayValues { get; set; }
}

public class ArrayValue : IArrayValueEntity
{
    public int ArrayIndexX { get; set; }
    public int ArrayIndexY { get; set; }
    public int Value { get; set; }

    // FK property
    //public int MapId { get; set; }

    // Navigation property on the "many" side (note "virtual")
    public virtual Map Map { get; set; }
}

modelBuilderエンティティ クラス メンバーを装飾するinまたは属性を使用して、OnModelCreatingそれらの関係を構成します。

modelBuilder.Entity<Map>().HasMany(e => e.ArrayValues)
                          .WithRequired(e => e.Map);
于 2013-08-14T00:57:01.560 に答える