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,这样的情况仍然存在吗?还是需要抽出数据模型设计者?
问候 加斯帕豪格
这应该工作。使用SQL分析器并检查EF是否将有效单元ID插入到联结表中。 – 2011-04-04 21:26:45
我没有得到一个SQL Profiler方便,但我已经在调试过程中检查了列表中单元的ID属性,它们正是它们应该是。 – Hauge 2011-04-04 21:51:13