加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 升级到RC后,创建多对多关系的实体失败

发布时间:2020-12-16 01:42:44 所属栏目:百科 来源:网络整理
导读:我有一个项目有3个简单的表,几个POCO类,以及用代码创建的DBContext,没有edml文件.下面的代码设置用于处理实体框架代码的beta – 首先,我编辑了DbContext代码,因为模型构建器从beta改为RC 表(简单表多对多表的字段声明为具有级联删除的外键): CREATE TABLE [
我有一个项目有3个简单的表,几个POCO类,以及用代码创建的DBContext,没有edml文件.下面的代码设置用于处理实体框架代码的beta – 首先,我编辑了DbContext代码,因为模型构建器从beta改为RC

表(简单表多对多表的字段声明为具有级联删除的外键):

CREATE TABLE [dbo].[Bookings](
    [ID] [int] IDENTITY(1,1) NOT NULL,[StartDate] [datetime] NOT NULL,[EndDate] [datetime] NOT NULL,[AccountId] [varchar](50) NOT NULL,CONSTRAINT [PK_Bookings] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)

CREATE TABLE [dbo].[Units](
    [ID] [int] IDENTITY(1,[Name] [nvarchar](100) NOT NULL,[Description] [nvarchar](1000) NULL,[Beds] [int] NOT NULL,CONSTRAINT [PK_Units] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)

CREATE TABLE [dbo].[UnitBookings](
    [UnitId] [int] NOT NULL,[BookingId] [int] NOT NULL
) ON [PRIMARY]

POCOS:

public class Unit
{
    [Key]
    public int ID { get; set; }
    [Required]
    public string Name { get; set; }
    public string Description { get; set; }
    [Required]
    public int Beds { get; set; }
    public ICollection<Booking> Bookings { get; set; }
}

public class Booking
{
    [Key]
    public int ID { get; set; }
    [Required]
    public DateTime StartDate { get; set; }
    [Required]
    public DateTime EndDate { get; set; }
    [Required]
    public string AccountId { get; set; }
    public ICollection<Unit> Units { get; set; }
}

DB上下文

public class BookingDb : DbContext
{
    public DbSet<Booking> Bookings { get; set; }
    public DbSet<Unit> Units { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Unit>()
            .HasMany(u => u.Bookings)
            .WithMany(b => b.Units)
            .Map(m => m.MapLeftKey("BookingId").MapRightKey("UnitId").ToTable("UnitBookings"));
    }
}

创建预订(bookingCarrrier是由前端层提供的帮助类)

public static bool CreateBooking(BookingCarrier carrier,out string statusMsg)
{
    using (var db = new BookingDB())
    {
        var validator = new BookingValidator(2,3);
        Booking booking = CreateBooking(carrier,db);
        if (validator.Validate(booking.AccountId,booking,-1,out statusMsg)
        {
            db.Bookings.Add(booking);
            db.SaveChanges();
            return true;
        }
        return false;
    }
}

private static CreateBooking(BookingCarrier carrier,BookingDB db)
{
    var units = new List<Unit>();
    if (carrier.SelectedUnit == 0)
        units.AddRange(db.Units.ToList());
    else
        units.Add(db.Units.Find(carrier.SelectedUnit));
    return new Booking
        {
            AccountId = carrier.AccountId,EndDate = carrier.EndDate,StartDate = carrier.StartDate,Units = units
        };
}

执行此代码时,EF会抛出SqlException,并显示以下消息:

The INSERT statement conflicted with
the FOREIGN KEY constraint
“FK_UnitBookings_Units”. The conflict
occurred in database “grashult.dk”,
table “dbo.Units”,column ‘ID’.

在测试版中并非如此.

我知道这是一个相当简单的设置,但由于这是一个爱好项目,我正在尝试看看这样的事情是多么简单.

有人知道导致这种行为的变化吗? EF 4.1仍然可以实现这样的功能,还是我必须甩掉数据模型设计师?

问候
Jesper Hauge

解决方法

您必须交换密钥映射:

modelBuilder.Entity<Unit>()
            .HasMany(u => u.Bookings)
            .WithMany(b => b.Units)
            .Map(m => m.MapLeftKey("UnitId")
                       .MapRightKey("BookingId")
                       .ToTable("UnitBookings"));

我刚刚测试了它,问题是Booking.Id存储在Booking.Id中的UnitId和UnitId中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读