实体框架 - 空间数据类型
Entity Framework 5 引入了空间类型支持。还包含一组运算符,允许查询分析空间数据。例如,查询可以根据两个地理位置之间的距离进行过滤。
Entity Framework 将允许将新的空间数据类型作为类的属性公开,并将其映射到数据库中的空间列。
您还可以编写 LINQ 查询,利用空间运算符根据数据库中执行的空间计算进行过滤、排序和分组。
有两种主要的空间数据类型 −
地理数据类型存储椭圆体数据,例如 GPS 纬度和经度坐标。
几何数据类型表示欧几里得(平面)坐标系。
让我们看一下下面的板球场示例。
步骤 1 −从"文件"->"新建"->"项目"菜单选项创建新项目。
步骤 2 − 在左侧窗格中,选择控制台应用程序。
步骤 3 − 右键单击项目名称并选择管理 NuGet 包…
步骤 4 − 安装 Entity Framework。
步骤 5 −添加对 System.Data.Entity 程序集的引用,并为空间数据类型添加 System.Data.Spatial 使用语句。
步骤 6 − 在 Program.cs 文件中添加以下类。
public class CricketGround { public int ID { get; set; } public string Name { get; set; } public DbGeography Location { get; set; } }
步骤 7 − 除了定义实体之外,您还需要定义一个从 DbContext 派生并公开 DbSet<TEntity> 属性的类。
在 Program.cs 中添加上下文定义。
public partial class CricketGroundContext : DbContext { public DbSet<CricketGround> CricketGrounds { get; set; } }
步骤 8 − 将以下代码添加到 Main 函数中,这将向上下文中添加两个新的 CricketGround 对象。
class Program { static void Main(string[] args) { using (var context = new CricketGroundContext()) { context.CricketGrounds.Add(new CricketGround() { Name = "Shalimar Cricket Ground", Location = DbGeography.FromText("POINT(-122.336106 47.605049)"), }); context.CricketGrounds.Add(new CricketGround() { Name = "Marghazar Stadium", Location = DbGeography .FromText("POINT(-122.335197 47.646711)"), }); context.SaveChanges(); var myLocation = DbGeography.FromText("POINT(-122.296623 47.640405)"); var cricketGround = (from cg in context.CricketGrounds orderby cg.Location.Distance(myLocation) select cg).FirstOrDefault(); Console.WriteLine("The closest Cricket Ground to you is: {0}.", cricketGround.Name); } } }
使用 DbGeography.FromText 方法初始化空间属性。以 WellKnownText 表示的地理点被传递给该方法,然后保存数据。之后,将检索最接近指定位置的 CricketGround 对象。
执行上述代码后,您将收到以下输出 −
The closest Cricket Ground to you is: Marghazar Stadium
我们建议您逐步执行上述示例,以便更好地理解。