Windows Phone LINQ to SQL SqlCeException

时间:2013-01-09 17:16:52

标签: windows-phone-7 linq-to-sql

对于学校项目,我们必须制作Windows Phone 7.1应用程序。它必须使用本地数据库,我们必须使用LINQ和Bing Maps。

我们正在创建一个从数据库中检索路由的应用程序。每条路线都有一些路标。

现在,我们制作了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时,我们还在程序中进一步看到了这个问题(我们实际上已经很远了,但这让我们退缩了)。

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

此致, Tregan

2 个答案:

答案 0 :(得分:0)

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

你有这样的选择吗?

enter image description here

答案 1 :(得分: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时它会起作用,但不是在我添加更多时。

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