2016-12-06 75 views
0

我有两个型号,在一比一的关系配置:与实体 - 一一对应的关系

public class PointOfInterestModel 
{ 
    [Key] 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 
    public string Description { get; set; } 

    [Required] 
    public CoordinatesModel Coordinates { get; set; } 

} 

public class CoordinatesModel 
{ 
    [Key] 
    [ForeignKey("PointOfInterest")] 
    public int Id { get; set; } 

    [Required] 
    public float Longitude { get; set; } 

    [Required] 
    public float Latitude { get; set; } 

    public PointOfInterestModel PointOfInterest { get; set; } 
} 

因此,他们应该在一比一的关系存在。 PointOfInterestModel应该只有一个CoordinatesModel,而CoordinatesModel应该只有一个PointOfInterestModel。

现在,我想从我的数据库中查询我所有的兴趣点,并获取与他们的所有坐标。

以下是我认为应该工作,但不会:

pointsOfInterestList = db.PointOfInterestModels.Include(x=>x.Coordinates).ToList(); 

那么,什么是错的?它是在关系中,还是在LINQ查询中?

我一直在试图解决这个问题好几个小时。

+0

“应该工作,但不是” - 发生了什么?例外,错误的数据,没有? – Dmitry

+0

哦,是的,我得到这个异常:System.Reflection.TargetInvocationException。如果我删除linq查询的包含部分,我没有得到这个异常,但是当然,pointOfInterestModel.coordinates是null。 –

+0

有没有什么有趣的“内部”这个异常(有你的表/列的名称)?你正在使用什么EF版本? – Dmitry

回答

0

检查您的数据库。

我怀疑你会在PointOfInterestModel表中找到额外的CoordinatesModelId字段。

EF无法猜测PointOfInterestModel.CordinatesCoordinatesModel.PointOfInterest的参考号码相同,并创建新的。

尽量多了一个属性添加到PointOfInterestModel:书面

[Required] 
[InverseProperty("PointOfInterest")] 
public CoordinatesModel Coordinates { get; set; } 
+0

“PointOfInterestModel”表中没有'CoordinatesModelId'字段。这也是令我困惑的事情之一,但由于我没有在移民方面遇到任何错误,所以我认为没有什么是错的。 –

+0

Intresting ...你可以在DB中添加这张表的截图/脚本吗?那里的一切“看起来不错”? – Dmitry

+0

这是我的数据库中的[Database Diagram](http://imgur.com/a/okPVY)。我的其他关系看起来很好。在CoordinatesModel表下的“keys”下拉列表中,我可以看到它的外键为'PointOfInterestModel'表,但不是相反。 –

0

我从来没有见过的关系这样一个实体,也许重写外键属性为了能够解决您的问题。不要将该属性添加到Id字段,请尝试将其添加到虚拟对象。

public class CoordinatesModel 
{ 
    [Key]  
    public int Id { get; set; } 

    [Required] 
    public float Longitude { get; set; } 

    [Required] 
    public float Latitude { get; set; } 

    [ForeignKey("Id")] 
    public virtual PointOfInterestModel PointOfInterest { get; set; } 
} 
+0

[这似乎解决了关系](http://imgur.com/a/D0Bko)。但是当我试图查询时我仍然得到异常。 –

+0

我从来没有使用'include' linq查询,但大多数语法建议使用引号来寻找你想要的。你可以在这个例子中看到一个例子:http://stackoverflow.com/a/6761246/7257637 –

+0

使用引号方法不起作用。同样的例外。 –