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,并显示以下消息:
在测试版中并非如此. 我知道这是一个相当简单的设置,但由于这是一个爱好项目,我正在尝试看看这样的事情是多么简单. 有人知道导致这种行为的变化吗? EF 4.1仍然可以实现这样的功能,还是我必须甩掉数据模型设计师? 问候 解决方法
您必须交换密钥映射:
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中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# – 数据库连接失败(System.Data.Sqlclient.SqlException
- Caused by: org.xml.sax.SAXParseException; lineNumber: 1
- SQLite 入门教程(三)好多约束 Constraints
- TDD培训回演:四则运算(总结)
- reactjs – 无法获取材料的属性-ui SelectField in react
- 为什么我的C#-console应用程序因复制文件时“内存不足”异常
- Cocos2d-x背景音乐和音效
- AJAX跨域调用相关知识-CORS和JSONP
- 基于React,Redux以及wilddog的聊天室简单实现
- c# – 线性渐变画笔淡化WPF