实体框架对象在数据库中重复

时间:2015-06-22 14:51:31

标签: c# entity-framework

我第一次使用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();
        }

我的问题是,每次我保存出租车时,驱动程序都会在数据库中复制。

您可以在此处查看数据库: enter image description here

有人能指出我正确的方向, 感谢

编辑: 驱动程序位于组合框中,并按此选择

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());

3 个答案:

答案 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;这是一种很好的做法,在这种情况下它引起了问题。

如果我为整个班级创建一个上下文,它按预期工作/