Asp.net mvc 主键冲突(即使已连接)-实体框架

Asp.net mvc 主键冲突(即使已连接)-实体框架,asp.net-mvc,database,entity-framework,exception,primary-key,Asp.net Mvc,Database,Entity Framework,Exception,Primary Key,在汽车共享应用程序中,用户可以提供一次乘坐,然后每次乘坐包含一个预订列表 但当我尝试添加预订时,它不起作用,即使客户(已添加)已附加 例外情况是: public void AddBooking(Booking b) { using (var ctx = new DataContext(Settings.Default.db)) { ctx.Members.Attach(b.Customer); ctx.Ride.Attach(b.Ride);

在汽车共享应用程序中,用户可以提供一次乘坐,然后每次乘坐包含一个预订列表

但当我尝试添加预订时,它不起作用,即使客户(已添加)已附加

例外情况是:

public void AddBooking(Booking b)
{
    using (var ctx = new DataContext(Settings.Default.db))
    {
        ctx.Members.Attach(b.Customer);
        ctx.Ride.Attach(b.Ride);

        ctx.Bookings.Add(b);

        ctx.SaveChanges();
    }
}
附加类型为“CARS\u Models.Models.Member”的实体失败,因为 相同类型的另一个实体已具有相同的主键值。 当使用“附加”方法或设置 如果图形中的任何实体已更改,则将实体更改为“未更改”或“已修改” 相互冲突的键值。这可能是因为一些实体是新的,并且 尚未收到数据库生成的键值。在这种情况下,使用'Add' 方法或添加的实体状态来跟踪图形,然后设置 将非新实体的状态适当地更改为“未更改”或“已修改”

方法是:

public void AddBooking(Booking b)
{
    using (var ctx = new DataContext(Settings.Default.db))
    {
        ctx.Members.Attach(b.Customer);
        ctx.Ride.Attach(b.Ride);

        ctx.Bookings.Add(b);

        ctx.SaveChanges();
    }
}
除此之外,我在这个项目中所做的一切都很好。我不明白这为什么不起作用。。我还尝试在“添加”之后“附加”,但也不起作用

类属性:

public class Ride
{
    public int Id { get; set; }
    public Member Driver { get; set; }
    public int TotalSeats { get; set; }
    public DateTime Date { get; set; } = DateTime.Now;
    public String Departure { get; set; }
    public String Arrival { get; set; }
    public int Price { get; set; }
    public List<Booking> Bookings { get; set; } = new List<Bookings>();
}

public class Member
{
    public string Login { get; set; } //This is the PK
    public string Password { get; set; }
    public List<Ride> Rides { get; set; } = new List<Ride>(); //Rides that this member will drive.
    public List<Booking> Bookings { get; set; } = new List<Reservation>(); //All the bookings he made (for others ride).
}

public class Booking
{
    public int Id { get; set; }
    public Member Customer { get; set; } //The member who paid.
    public int Seats { get; set; } //Because someone can book more than 1 seat.
    public Ride Ride { get; set; } //The ride it concerns.
}
公共级骑乘
{
公共int Id{get;set;}
公共成员驱动程序{get;set;}
公共整数{get;set;}
公共日期时间日期{get;set;}=DateTime.Now;
公共字符串离开{get;set;}
公共字符串到达{get;set;}
公共整数价格{get;set;}
公共列表预订{get;set;}=new List();
}
公共班级成员
{
公共字符串登录名{get;set;}//这是PK
公共字符串密码{get;set;}
公共列表骑乘{get;set;}=new List();//此成员将驾驶的骑乘。
公共列表预订{get;set;}=new List();//他(为其他人)所做的所有预订。
}
公共课预订
{
公共int Id{get;set;}
公共成员客户{get;set;}//支付的成员。
public int Seats{get;set;}//因为某人可以预订多个座位。
公共骑乘{get;set;}//与之相关的骑乘。
}

这可能最有帮助
b.Customer
b.Ride.Driver
是不同的
成员
实例,具有相同的PK
登录名
。哦,是的,对于我做的测试,它们是相同的,你认为这是问题所在吗?我会尝试与不同的成员…天哪。。。这就是问题所在。。。我不知道你是怎么猜到的,但谢谢你:D。。。非常令人印象深刻:p。。。这很可能有帮助。客户和驾驶员是不同的成员,具有相同的PK
Login
。哦,是的,对于测试,我将它们设置为相同的,你认为这是问题所在吗?我会尝试与不同的成员…天哪。。。这就是问题所在。。。我不知道你是怎么猜到的,但谢谢你:D。。。非常令人印象深刻:p。。。