3

我有一个包含3个简单表的项目,一些POCO类以及使用代码创建的DBContext,没有edml文件。下面的代码设置用于处理实体框架代码的测试版 - 首先,我编辑了DbContext代码,因为ModelBuilder从测试版更改为RC升级到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,1) NOT NULL, 
    [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:

INSERT语句冲突以 FOREIGN KEY约束 “FK_UnitBookings_Units”。冲突 发生在数据库“grashult.dk”, 表“dbo.Units”列'ID'中。

在测试版中,情况并非如此。

我知道这是一个相当简单的设置,但是因为这是一个爱好项目,我正试着看看这样的事情是多么简单。

是否有人知道导致此行为的变化?对于EF 4.1,这样的情况仍然存在吗?还是需要抽出数据模型设计者?

问候 加斯帕豪格

+0

这应该工作。使用SQL分析器并检查EF是否将有效单元ID插入到联结表中。 – 2011-04-04 21:26:45

+0

我没有得到一个SQL Profiler方便,但我已经在调试过程中检查了列表中单元的ID属性,它们正是它们应该是。 – Hauge 2011-04-04 21:51:13

回答

7

您必须交换密钥映射:

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

我只是测试它,问题是,Booking.Id存储在UnitIdUnitIdBooking.Id