我第一次使用Entity Framework(代码优先),我有一点问题。
我有一个名为Taxi& amp;一个名为Driver
出租车有一个对司机的引用,你可以看到两个分类
public partial class Taxi
{
public Taxi()
{
}
public int TaxiId { get; set; }
public Driver Driver { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public Color Colour { get; set; }
public string NumPlate { get; set; }
public int MaxPassengers { get; set; }
}
public partial class Driver
{
public Driver()
{
}
public int DriverId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string HomePhone { get; set; }
public string MobilePhone { get; set; }
public DateTime JoinedFirm { get; set; }
}
我正在保存已更改的出租车:
using (var db = new DataModel())
{
db.Configuration.ProxyCreationEnabled = false;
db.Taxis
.Where(x => x.TaxiId == CurrenltySelectedTaxi.TaxiId)
.ToList()
.ForEach(x =>
{
x.Make = CurrenltySelectedTaxi.Make;
x.Model = CurrenltySelectedTaxi.Model;
x.NumPlate = CurrenltySelectedTaxi.NumPlate;
x.Colour = CurrenltySelectedTaxi.Colour;
x.MaxPassengers = CurrenltySelectedTaxi.MaxPassengers;
x.Driver = CurrenltySelectedTaxi.Driver;
});
db.SaveChanges();
}
我的问题是,每次我保存出租车时,驱动程序都会在数据库中复制。
您可以在此处查看数据库:
有人能指出我正确的方向, 感谢
编辑: 驱动程序位于组合框中,并按此选择
private void cmbTaxiDriver_SelectedIndexChanged(object sender, EventArgs e)
{
using (var db = new DataModel())
{
db.Configuration.ProxyCreationEnabled = false;
Driver listSelected = (Driver) cmbTaxiDriver.SelectedItem;
CurrenltySelectedTaxi.Driver = db.Drivers.Where(x => x.DriverId == listSelected.DriverId).ToArray()[0];
}
}
组合框的填充方式如下:
listDrivers.Items.AddRange(db.Drivers.ToArray());
答案 0 :(得分:1)
根据您提供的内容,我唯一可以找到的是CurrenltySelectedTaxi.Driver
是一个独立的或新的驱动程序。请注意确保CurrenltySelectedTaxi.Driver
指向的对象是附加的驱动程序记录。
您可以执行的帮助确定该记录状态的选项是在该行上放置断点,然后查看DbEntry记录状态。
答案 1 :(得分:1)
您的设计不会在要转换为数据库的Taxi和Driver之间创建关系。尝试这样的事情:
public partial class Taxi
{
public Taxi()
{
}
public int TaxiId { get; set; }
public int DriverId {get; set; }
public virtual Driver Driver { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public Color Colour { get; set; }
public string NumPlate { get; set; }
public int MaxPassengers { get; set; }
}
您可能还想将以下内容添加到Driver对象:
public virtual IEnumerable<Taxi> Taxis { get; set; }
答案 2 :(得分:0)
所以事实证明我的问题是因为我遵循MSDN上的教程,该教程说重新创建你的上下文每次使用它。虽然这可能&#39;这是一种很好的做法,在这种情况下它引起了问题。
如果我为整个班级创建一个上下文,它按预期工作/