4

我有一个 2D 值数组,可以在大小范围内(尽管如果需要,我可以制作一个大的、固定的大小)我想存储在数据库中。谁能告诉我最好的方法来做到这一点?

4

1 回答 1

4

对我来说,二维数组听起来像(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成为实体的主键(并让 EF 强制这两个值的组合的唯一性)如果您要使用code-firstOnModelCreating来覆盖您的方法。DbContext

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 数组返回。

编辑

要解决作为地图实体“一部分”的二维数组,您只需定义导航属性- 如果您愿意,还可以定义外键属性

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; }
}

使用装饰实体类成员的modelBuilderin或属性,然后配置这些关系:OnModelCreating

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