【发布时间】:2012-01-07 08:27:54
【问题描述】:
我有一个继承层次结构,其中 Action 是 ActionCompleted 和 ActionCancelled 的父级。 Order 类有一个从零到一的 ActionCompleted 和 ActionCancelled。我已经尝试过 TPH 和 TPT(甚至尝试过 edmx)但无法让实体理解订单和子操作之间的这种关系,请建议我如何映射?
//Classes
public class Order
{
public int OrderId { get; set; }
public string Name { get; set; }
public ActionCompleted ACO { get; set; }
public ActionCancelled ACA { get; set; }
}
public class Action
{
public int ActionID { get; set; }
public DateTime ActionDT { get; set; }
public Order Order { get; set; }
}
public class ActionCompleted : Action
{
}
public class ActionCancelled : Action
{
public int CancelledByPhysician { get; set; }
}
//映射
public class EDISContext:DbContext
{
public EDISContext()
: base("EDISContext")
{ }
public DbSet<Order> Orders { get; set; }
public DbSet<Action> Actions { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>().ToTable("Orders");
modelBuilder.Entity<Action>().HasKey(a => a.ActionID);
modelBuilder.Entity<Action>().Map(m => m.ToTable("Actions"))
.Map<ActionCompleted>(m => m.ToTable("ActionCompleted"))
.Map<ActionCancelled>(m => m.ToTable("ActionCancelled"));
//modelBuilder.Entity<Action>().HasRequired(a => a.Order).WithOptional().Map(m => m.MapKey("DiagOrderId"));
modelBuilder.Entity<ActionCompleted>().HasRequired(a => a.Order).WithOptional().Map(m => m.MapKey("DiagOrderId"));
modelBuilder.Entity<ActionCancelled>().HasRequired(a => a.Order).WithOptional().Map(m => m.MapKey("DiagOrderId"));
}
}
用于保存数据的代码:
EDISContext db = new EDISContext();
var ord1 = db.Orders.FirstOrDefault(o => o.OrderId == 1);
ActionCompleted ac= new ActionCompleted();
ac.ActionDT = DateTime.Now;
ac.Order = ord1;
db.Actions.Add(ac);
db.SaveChanges();
数据库表脚本:
CREATE TABLE [dbo].[Orders](
[OrderId] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL,
) ON [PRIMARY]
CREATE TABLE [dbo].[Actions](
[ActionID] [int] IDENTITY(1,1) NOT NULL,
[ActionDT] [datetime] NOT NULL,
[DiagOrderID] [int] NULL,
) ON [PRIMARY]
CREATE TABLE [dbo].[ActionCompleted](
[ACID] [int] IDENTITY(1,1) NOT NULL,
[ActionID] [int] NOT NULL,
) ON [PRIMARY]
CREATE TABLE [dbo].[ActionCancelled](
[ACAID] [int] IDENTITY(1,1) NOT NULL,
[ActionID] [int] NOT NULL,
[CancelledByPhysician] [int] NULL,
) ON [PRIMARY]
【问题讨论】:
-
我知道我越来越不耐烦了,但我想知道是否正在使用实体框架?可能我需要开始研究 Nhibernate。
-
您能否阐明“无法让实体理解订单和子操作之间的这种关系”的意思?如果您创建订单和操作并尝试将它们保存到数据库中,会发生什么?我将您的代码复制并粘贴到控制台应用程序中,它运行良好。
-
我认为它会抛出类似于下面的异常:Invalid column name 'ActionCompleted_ActionId'。\r\nInvalid column name 'ActionCompleted_ActionId ---- 只是要清楚 Orders 表与 Actions 表相关,与OrderId 作为外键存储在 Action 表中。 (orders 表中没有引用键,这是您创建表的方式吗?)----如果您不介意,请发布您创建的表的脚本,我将再次尝试我的代码。我会尽快发布我的表格脚本。
-
另一件事:我在添加操作时使用现有订单,我设置了他们的订单属性,见下文: EDISContext db = new EDISContext(); var ord1 = db.Orders.FirstOrDefault(o => o.OrderId == 1); OrderActionEntered ae1 = new OrderActionEntered(); ae1.ActionDoneBy=1; ae1.ActionDT =日期时间。现在; ae1.Order = ord1; db.OrderActions.Add(ae1); db.SaveChanges();
标签: inheritance entity-framework-4 entity-relationship fluent-interface