Таблица пропущенных при создании класса сущности Code-First, должна ли я изменить дизайн - PullRequest
0 голосов
/ 15 сентября 2018

Приведенная ниже схема базы данных была создана путем чтения файла 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)
        {
        }
    }
}

1 Ответ

0 голосов
/ 15 сентября 2018

EF требует, чтобы все таблицы имели первичный ключ, а ваша таблица компонентов не имеет одного

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...