Entity Framework - Наследование - От нуля до одного Отношение к дочернему объекту, как сопоставить? (Свободный API) - PullRequest
0 голосов
/ 27 ноября 2011

У меня есть иерархия наследования, где Action является родителем ActionCompleted и ActionCancelled. Класс заказа имеет нулевое значение ActionCompleted и ActionCancelled. Я пробовал TPH и TPT (даже пробовал edmx), но не смог заставить Entity понять эту взаимосвязь между Порядком и дочерними действиями, пожалуйста, предложите, как мне отобразить?

//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]

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

При первом использовании кода всегда полезно, по крайней мере, попытаться позволить EF создать базу данных для вас - это поведение по умолчанию (будет искать локальный экземпляр SQL Server с именем. \ SQLEXPRESS). Если вы создаете базу данных вручную и хотите управлять именами столбцов, что, как кажется, происходит, вам нужно указать имя столбца с помощью свободно распространяемого API. См. http://msdn.microsoft.com/en-us/library/hh295845(v=vs.103).aspx и http://msdn.microsoft.com/en-us/library/hh295847(v=VS.103).aspx для некоторых примеров, которые должны охватывать то, что вы застряли.

Просто для справки, база данных, которую вы создали, будет иметь следующие таблицы и имена столбцов:

CREATE TABLE [dbo].[ActionCancelled](
    [ActionID] [int] NOT NULL,
    [CancelledByPhysician] [int] NOT NULL,
PRIMARY KEY CLUSTERED ( [ActionID] ASC )
)

CREATE TABLE [dbo].[ActionCompleted](
    [ActionID] [int] NOT NULL,
PRIMARY KEY CLUSTERED ( [ActionID] ASC )
)

CREATE TABLE [dbo].[Actions](
    [ActionID] [int] IDENTITY(1,1) NOT NULL,
    [ActionDT] [datetime] NOT NULL,
    [Order_OrderId] [int] NULL,
PRIMARY KEY CLUSTERED ( [ActionID] ASC )
)

CREATE TABLE [dbo].[Orders](
    [OrderId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](max) NULL,
    [ACO_ActionID] [int] NULL,
    [ACA_ActionID] [int] NULL,
PRIMARY KEY CLUSTERED ( [OrderId] ASC )
)
0 голосов
/ 14 декабря 2011

Если вы настаиваете на создании и обслуживании базы данных самостоятельно, я советую вам попробовать использовать рабочий процесс Database First, а не Code First. Создайте Entity Data Model из вашей базы данных, затем сгенерируйте POCO. Это сделает вашу жизнь намного проще, особенно в случае, если вы измените схему базы данных.

Что касается EDM для понимания табличных отношений, вы должны установить их в базе данных. Я не знаю, если вы уже читали, потому что вы не вставили ни одного скрипта, который создает внешние ключи, но у VS не должно возникнуть проблем с пониманием заранее определенных схем.

...