如何通过实体框架存储可变二维数组

本文关键字:二维数组 存储 框架 何通过 实体 | 更新日期: 2023-09-27 18:27:30

我有一个2D值数组,它的大小可以在一定范围内(尽管,如果需要,我可以制作一个大的固定大小),我想将其存储在数据库中。有人能告诉我最好的方法吗?

如何通过实体框架存储可变二维数组

对我来说,2D数组听起来像(x,y) = somevalue。所以我想到了一些简单的东西,比如这样(假设somevalueint):

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

然后,如果要先执行代码,则可以在重写DbContextOnModelCreating方法时使ArrayIndexXArrayIndexY成为实体的主键(并让EF强制这两个值的组合的唯一性)。

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

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

modelBuilder.Entity<Map>().HasMany(e => e.ArrayValues)
                          .WithRequired(e => e.Map);