1

对于一个学校项目,我们必须制作一个 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 时,我们还在程序中进一步看到了问题(实际上我们已经很远了,但这阻碍了我们)。

有没有人知道发生了什么?我们感谢任何帮助!

你的,特里根

4

2 回答 2

0

转到服务器资源管理器,然后转到您的 IDRoute列属性

你有这样的选择吗?

在此处输入图像描述

于 2013-01-09T21:10:22.120 回答
0

嗯,看来我已经通过添加一些东西来修复它

private Nullable<int> idRoute;
private Nullable<int> idWaypoint;

[Column(Storage = "idRoute", DbType = "Int")]
public int? IDRoute
{
    get
    {
        return this.idRoute;
    }
    set
    {
        this.idRoute = value;
    }
}

[Column(Storage = "idWaypoint", DbType = "Int")]
public int? IDWaypoint
{
    get
    {
        return this.idWaypoint;
    }
    set
    {
        this.idWaypoint = value;
    }
}

另外,我将关联更改为:

[Association(IsForeignKey = true, Storage = "routeValue", ThisKey="IDRoute")]
public Route Route
{
    get
    {
        return routeValue.Entity;
    }
    set
    {
        NotifyPropertyChanging("Route");
        routeValue.Entity = value;
        NotifyPropertyChanged("Route");
    }
}

[Association(IsForeignKey = true, Storage = "waypointValue", ThisKey="IDWaypoint")]
public Waypoint Waypoint
{
    get
    {
        return waypointValue.Entity;
    }
    set
    {
        NotifyPropertyChanging("Waypoint");
        waypointValue.Entity = value;
        NotifyPropertyChanged("Waypoint");
    }
}

我必须添加包含 Route 和 Waypoint 主键的列,这似乎是合乎逻辑的。但是,我仍然不明白为什么当我添加 2 时它会起作用,但当我添加更多时却不会。

好吧,它现在已经修好了,所以一切都很好。

于 2013-01-10T10:52:51.463 回答