对于一个学校项目,我们必须制作一个 Windows Phone 7.1 应用程序。它必须使用本地数据库,为此我们必须使用 LINQ 和 Bing 地图。
我们正在制作一个将从数据库中检索路由的应用程序。每条路线都有一些航路点。
现在,我们制作了 3 个表(更实际,但目前只有这 3 个是相关的),即“Route”、“Waypoint”和“RouteWaypointLink”。你可以在下面看到他们的课程
路线:
[Table]
public class Route : INotifyPropertyChanged, INotifyPropertyChanging
{
public event PropertyChangingEventHandler PropertyChanging;
public event PropertyChangedEventHandler PropertyChanged;
private int idRouteValue;
private string nameValue;
[Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
public int IDRoute
{
get
{
return idRouteValue;
}
private set
{
NotifyPropertyChanging("IDRoute");
idRouteValue = value;
NotifyPropertyChanged("IDRoute");
}
}
[Column]
public string Name
{
get
{
return nameValue;
}
set
{
NotifyPropertyChanging("Name");
nameValue = value;
NotifyPropertyChanged("Name");
}
}
/// <summary>
///
/// </summary>
/// <param name="propertyName"></param>
private void NotifyPropertyChanging(string propertyName)
{
if (PropertyChanging != null)
{
PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
}
}
/// <summary>
///
/// </summary>
/// <param name="propertyName"></param>
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public override string ToString()
{
return "[" + IDRoute + "] " + Name;
}
}
航点:
[Table]
public class Waypoint : INotifyPropertyChanged, INotifyPropertyChanging
{
public event PropertyChangingEventHandler PropertyChanging;
public event PropertyChangedEventHandler PropertyChanged;
private int idWaypointValue;
private string nameValue;
private double gpsLongitudeValue;
private double gpsLatitudeValue;
private string descriptionValue;
[Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
public int IDWaypoint
{
get
{
return idWaypointValue;
}
private set
{
NotifyPropertyChanging("IDWaypoint");
idWaypointValue = value;
NotifyPropertyChanged("IDWaypoint");
}
}
[Column]
public string Name
{
get
{
return nameValue;
}
set
{
NotifyPropertyChanging("Name");
nameValue = value;
NotifyPropertyChanged("Name");
}
}
[Column]
public double GPSLongitude
{
get
{
return gpsLongitudeValue;
}
set
{
NotifyPropertyChanging("GPSLongitude");
gpsLongitudeValue = value;
NotifyPropertyChanged("GPSLongitude");
}
}
[Column]
public double GPSLatitude
{
get
{
return gpsLatitudeValue;
}
set
{
NotifyPropertyChanging("GPSLatitude");
gpsLatitudeValue = value;
NotifyPropertyChanged("GPSLatitude");
}
}
[Column]
public string Description
{
get
{
return descriptionValue;
}
set
{
NotifyPropertyChanging("Description");
descriptionValue = value;
NotifyPropertyChanged("Description");
}
}
/// <summary>
///
/// </summary>
/// <param name="propertyName"></param>
private void NotifyPropertyChanging(string propertyName)
{
if (PropertyChanging != null)
{
PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
}
}
/// <summary>
///
/// </summary>
/// <param name="propertyName"></param>
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public override string ToString()
{
return Name;
}
}
RouteWaypointLink:
[Table]
public class RouteWaypointLink : INotifyPropertyChanged, INotifyPropertyChanging
{
public event PropertyChangingEventHandler PropertyChanging;
public event PropertyChangedEventHandler PropertyChanged;
private int idRouteWaypointLinkValue;
private EntityRef<Route> routeValue;
private EntityRef<Waypoint> waypointValue;
private int waypointIndexValue;
[Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
public int IDRouteWaypointLink
{
get
{
return idRouteWaypointLinkValue;
}
private set
{
NotifyPropertyChanging("IDRouteWaypointLink");
idRouteWaypointLinkValue = value;
NotifyPropertyChanged("IDRouteWaypointLink");
}
}
[Association(IsForeignKey = true, Storage = "routeValue")]
public Route Route
{
get
{
return routeValue.Entity;
}
set
{
NotifyPropertyChanging("Route");
routeValue.Entity = value;
NotifyPropertyChanged("Route");
}
}
[Association(IsForeignKey = true, Storage = "waypointValue")]
public Waypoint Waypoint
{
get
{
return waypointValue.Entity;
}
set
{
NotifyPropertyChanging("Waypoint");
waypointValue.Entity = value;
NotifyPropertyChanged("Waypoint");
}
}
[Column]
public int WaypointIndex
{
get
{
return waypointIndexValue;
}
set
{
NotifyPropertyChanging("Index");
waypointIndexValue = value;
NotifyPropertyChanged("Index");
}
}
/// <summary>
///
/// </summary>
/// <param name="propertyName"></param>
private void NotifyPropertyChanging(string propertyName)
{
if (PropertyChanging != null)
{
PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
}
}
/// <summary>
///
/// </summary>
/// <param name="propertyName"></param>
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public override string ToString()
{
return waypointValue.Entity.ToString();
}
}
当我们启动我们的程序时,我们想用一些测试数据填充它:
/// <summary>
///
/// </summary>
/// <param name="connection"></param>
public static void MakeDB(string connection)
{
RallyDatabase db = new RallyDatabase(connection);
//Temp
db.DeleteDatabase();
if (!db.DatabaseExists())
{
db.CreateDatabase();
#region waypoint
Waypoint w1 = new Waypoint();
w1.Name = "VVV Breda";
w1.GPSLatitude = 51.59380;
w1.GPSLongitude = 4.77963;
db.WaypointTable.InsertOnSubmit(w1);
Waypoint w2 = new Waypoint();
w2.Name = "Liefdeszuster";
w2.GPSLatitude = 51.59307;
w2.GPSLongitude = 4.77969;
db.WaypointTable.InsertOnSubmit(w2);
Waypoint w3 = new Waypoint();
w3.Name = "Valkenberg";
w3.GPSLatitude = 51.59250;
w3.GPSLongitude = 4.77969;
db.WaypointTable.InsertOnSubmit(w3);
#endregion
#region route
Route testRoute1 = new Route();
testRoute1.Name = "Kroegentocht";
db.RouteTable.InsertOnSubmit(testRoute1);
Route testRoute2 = new Route();
testRoute2.Name = "Bezienswaardighedentocht";
db.RouteTable.InsertOnSubmit(testRoute2);
#endregion
#region waypointlinks
RouteWaypointLink routeWaypointLink1 = new RouteWaypointLink();
routeWaypointLink1.Route = testRoute1;
routeWaypointLink1.Waypoint = w1;
routeWaypointLink1.WaypointIndex = 0;
db.RouteLinkTable.InsertOnSubmit(routeWaypointLink1);
RouteWaypointLink routeWaypointLink2 = new RouteWaypointLink();
routeWaypointLink2.Route = testRoute1;
routeWaypointLink2.Waypoint = w2;
routeWaypointLink2.WaypointIndex = 1;
db.RouteLinkTable.InsertOnSubmit(routeWaypointLink2);
//Wut, why does it work when this is commented?
RouteWaypointLink routeWaypointLink3 = new RouteWaypointLink();
routeWaypointLink3.Route = testRoute1;
routeWaypointLink3.Waypoint = w3;
routeWaypointLink3.WaypointIndex = 2;
db.RouteLinkTable.InsertOnSubmit(routeWaypointLink3);
RouteWaypointLink routeWaypointLink4 = new RouteWaypointLink();
routeWaypointLink4.Route = testRoute2;
routeWaypointLink4.Waypoint = w1;
routeWaypointLink4.WaypointIndex = 0;
db.RouteLinkTable.InsertOnSubmit(routeWaypointLink4);
RouteWaypointLink routeWaypointLink5 = new RouteWaypointLink();
routeWaypointLink5.Route = testRoute2;
routeWaypointLink5.Waypoint = w2;
routeWaypointLink5.WaypointIndex = 1;
db.RouteLinkTable.InsertOnSubmit(routeWaypointLink5);
#endregion
db.SubmitChanges();
}
}
然而,当我们尝试运行它时,我们得到一个指向 db.SubmitChanges() 的错误:
SqlCeException was unhandled - A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = FK_RouteWaypointLink_Route ]
现在奇怪的是:当我评论 RouteWaypointLink 的最后 3 个插入时,它工作正常,所以它看起来像这样:
#region waypointlinks
RouteWaypointLink routeWaypointLink1 = new RouteWaypointLink();
routeWaypointLink1.Route = testRoute1;
routeWaypointLink1.Waypoint = w1;
routeWaypointLink1.WaypointIndex = 0;
db.RouteLinkTable.InsertOnSubmit(routeWaypointLink1);
RouteWaypointLink routeWaypointLink2 = new RouteWaypointLink();
routeWaypointLink2.Route = testRoute1;
routeWaypointLink2.Waypoint = w2;
routeWaypointLink2.WaypointIndex = 1;
db.RouteLinkTable.InsertOnSubmit(routeWaypointLink2);
//Wut, why does it work when this is commented?
//RouteWaypointLink routeWaypointLink3 = new RouteWaypointLink();
//routeWaypointLink3.Route = testRoute1;
//routeWaypointLink3.Waypoint = w3;
//routeWaypointLink3.WaypointIndex = 2;
//db.RouteLinkTable.InsertOnSubmit(routeWaypointLink3);
//RouteWaypointLink routeWaypointLink4 = new RouteWaypointLink();
//routeWaypointLink4.Route = testRoute2;
//routeWaypointLink4.Waypoint = w1;
//routeWaypointLink4.WaypointIndex = 0;
//db.RouteLinkTable.InsertOnSubmit(routeWaypointLink4);
//RouteWaypointLink routeWaypointLink5 = new RouteWaypointLink();
//routeWaypointLink5.Route = testRoute2;
//routeWaypointLink5.Waypoint = w2;
//routeWaypointLink5.WaypointIndex = 1;
//db.RouteLinkTable.InsertOnSubmit(routeWaypointLink5);
#endregion
db.SubmitChanges();
当插入 2 个 RouteWaypointLinks 时它确实有效,但当我们尝试创建 5 个时它不工作,这不是很奇怪吗?
当我们尝试添加一些 RouteWaypointLinks 时,我们还在程序中进一步看到了问题(实际上我们已经很远了,但这阻碍了我们)。
有没有人知道发生了什么?我们感谢任何帮助!
你的,特里根