Приведенная ниже схема базы данных была создана путем чтения файла xml в набор данных, а затем преобразования таблиц и отношений в базу данных SQL Server.
- таблица foreach в наборе данных,
- создать таблицу,
- для каждого отношения в наборе данных
- создать отношения.
Файлы классов были созданы с помощью Entity Framework; Visual Studio 2015, добавление элемента ADO, сначала код из базы данных.
Как вы заметите, таблица Component
полностью игнорируется генерацией файлов классов Entity Framework. Смотрите мои обобщенные вопросы ..
Я запустил XSD.exe /c
в своем xsd-файле, и он создал класс Component
.
Учитывая, что таблицы и отношения были созданы с помощью xml для набора данных на SQL Server - и не разработаны вручную;
- Нужно ли менять эту модель E-R?
- Должен ли я создать 2 отдельные таблицы для
Component
, например AssemblyItemA_Component
, а затем AssemblyItemB_Component
?
Я буду обрабатывать XML-файлы, которые следуют этому шаблону, и добавлять их данные в эти таблицы, поэтому важно знать, что мне здесь делать?
Я думаю, что мне следует дополнительно нормализовать таблицы в две таблицы, любые предложения приветствуются.
После обработки файлов XML, когда они находятся в SQL Server; Я буду выполнять несколько различных функций и процессов, а затем перенести связанные записи unit_Id в таблицу work_Table, а затем при необходимости обновлять исходные таблицы из таблицы work_Table.
В итоге:
- Почему при генерации файлов классов Entity Framework таблица
Component
полностью игнорируется?
- Должен ли я изменить структуру E-R для таблицы
Component
?
- Если изменить дизайн: я должен создать 2 отдельные таблицы
AssemblyItemA_Component
и AssemblyItemB_Component
[Простота запросов будет лучше?]
- В основном я буду обновлять таблицы Units, Unit и AssemblyItemA / B (запрос включает
Component
). Я хотел бы иметь образец EF Framework для запроса / (вставить или обновить).
EDIT
Из комментариев EF нужен первичный ключ. Понял ..
Теперь я должен вручную изменить структуру таблицы; Здесь очень много
способы сделать это, что лучше или лучше, учитывая данные?
- Разделение компонентов на две таблицы CompA, CompB.
- Добавьте поле Id и избавьтесь от ограничений FK.
- Добавить PartType и PartCode в таблицы AssemblyItemA и AssemblyItemB?
- Где мне сначала сделать это изменение в наборе данных из файла XML, а затем разрешить ему создавать таблицы для SQL и обрабатывать все таким образом?
SQL-скрипты для создания базы данных:
CREATE TABLE [dbo].[AssemblyItemA]
(
[AssemblyItemA_Id][int]NOT NULL,
[Unit_Id] [int]NULL,
CONSTRAINT [PK_AssemblyItemA]
PRIMARY KEY CLUSTERED([AssemblyItemA_Id] ASC)
) ON[PRIMARY]
GO
CREATE TABLE [dbo].[AssemblyItemB]
(
[AssemblyItemB_Id][int]NOT NULL,
[Unit_Id] [int]NULL,
CONSTRAINT [PK_AssemblyItemB]
PRIMARY KEY CLUSTERED([AssemblyItemB_Id] ASC)
) ON[PRIMARY]
GO
CREATE TABLE [dbo].[Component]
(
[PartType][varchar](255) NULL,
[PartCode][varchar](255) NULL,
[AssemblyItemA_Id][int]NULL,
[AssemblyItemB_Id][int]NULL
) ON[PRIMARY]
GO
CREATE TABLE [dbo].[Unit]
(
[Unit_Id] [int] NOT NULL,
[UnitNumber] [nvarchar](50) NULL,
[Quantity] [int] NOT NULL,
[PartCode] [nvarchar](15) NULL,
[PartType] [nvarchar](15) NULL,
[Units_Id] [int]NULL,
CONSTRAINT [PK_Unit]
PRIMARY KEY CLUSTERED ([Unit_Id] ASC)
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Units]
(
[Units_Id] [int] NOT NULL,
[Batch_Id] [int] NULL,
CONSTRAINT [PK_Units]
PRIMARY KEY CLUSTERED ([Units_Id] ASC)
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[AssemblyItemA] WITH CHECK
ADD CONSTRAINT [Unit_AssemblyItemA]
FOREIGN KEY([Unit_Id]) REFERENCES[dbo].[Unit] ([Unit_Id])
GO
ALTER TABLE [dbo].[AssemblyItemA]
CHECK CONSTRAINT [Unit_AssemblyItemA]
GO
ALTER TABLE [dbo].[AssemblyItemB] WITH CHECK
ADD CONSTRAINT [Unit_AssemblyItemB]
FOREIGN KEY([Unit_Id]) REFERENCES [dbo].[Unit] ([Unit_Id])
GO
ALTER TABLE [dbo].[AssemblyItemB]
CHECK CONSTRAINT [Unit_AssemblyItemB]
GO
ALTER TABLE [dbo].[Component] WITH CHECK
ADD CONSTRAINT [AssemblyItemA_Component]
FOREIGN KEY([AssemblyItemA_Id]) REFERENCES[dbo].[AssemblyItemA] ([AssemblyItemA_Id])
GO
ALTER TABLE [dbo].[Component]
CHECK CONSTRAINT [AssemblyItemA_Component]
GO
ALTER TABLE [dbo].[Component] WITH CHECK
ADD CONSTRAINT [AssemblyItemB_Component]
FOREIGN KEY([AssemblyItemB_Id]) REFERENCES[dbo].[AssemblyItemB] ([AssemblyItemB_Id])
GO
ALTER TABLE [dbo].[Component]
CHECK CONSTRAINT [AssemblyItemB_Component]
GO
ALTER TABLE [dbo].[Unit] WITH CHECK
ADD CONSTRAINT [Units_Unit]
FOREIGN KEY([Units_Id]) REFERENCES[dbo].[Units] ([Units_Id])
GO
ALTER TABLE [dbo].[Unit]
CHECK CONSTRAINT [Units_Unit]
Класс контекста, созданный Entity Framework (подход, основанный на коде):
namespace MyContext
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Data.Entity.Spatial;
using System.Linq;
[Table("AssemblyItemB")]
public partial class AssemblyItemB
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int AssemblyItemB_Id { get; set; }
public int? Unit_Id { get; set; }
public virtual Unit Unit { get; set; }
}
[Table("AssemblyItemA")]
public partial class AssemblyItemA
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int AssemblyItemA_Id { get; set; }
public int? Unit_Id { get; set; }
public virtual Unit Unit { get; set; }
}
[Table("Unit")]
public partial class Unit
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Unit()
{
AssemblyItemAs = new HashSet<AssemblyItemA>();
AssemblyItemBs = new HashSet<AssemblyItemB>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Unit_Id { get; set; }
[StringLength(50)]
public string UnitNumber { get; set; }
public int Quantity { get; set; }
[StringLength(15)]
public string PartCode { get; set; }
[StringLength(15)]
public string PartType { get; set; }
public int? Units_Id { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<AssemblyItemA> AssemblyItemAs { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<AssemblyItemB> AssemblyItemBs { get; set; }
public virtual Unit1 Unit1 { get; set; }
}
[Table("Units")]
public partial class Unit1
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Unit1()
{
Units = new HashSet<Unit>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Units_Id { get; set; }
public int? Batch_Id { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Unit> Units { get; set; }
}
public partial class TESTV1Context : DbContext
{
public TESTV1Context() : base("name=TESTV1Context")
{
}
public virtual DbSet<AssemblyItemA> AssemblyItemAs { get; set; }
public virtual DbSet<AssemblyItemB> AssemblyItemBs { get; set; }
public virtual DbSet<sysdiagram> sysdiagrams { get; set; }
public virtual DbSet<Unit> Units { get; set; }
public virtual DbSet<Unit1> Units1 { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
}