Как создать несколько ссылок на одну таблицу - Entity Framework - PullRequest
0 голосов
/ 23 октября 2018

enter image description here

У нас есть требование, чтобы несколько таблиц были отнесены в одну таблицу, как показано на диаграмме.

Обратите внимание, что диаграмма НЕ является правильной моделью БД, а просто отражает наши требования.Можете ли вы предложить правильный способ реализации выше в SQL Server DB и Entity Framework 6?

Пример: Заказ на продажу (в таблице SalesOrder) может иметь несколько файлов и данные загруженного файлабудет храниться в таблице UploadedFile.Аналогично OrderTable и Invoice тоже.

Таким образом, мы должны иметь правильную модель БД с отношениями FK между таблицей FileUpload друг с другом связанной таблицей.

Примечание: Все таблицы PKявляются автоматически увеличиваемыми значениями int, и в будущем нам может понадобиться добавить больше сущностей (таблиц)

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Чтобы предоставить вам альтернативу, как вы сказали, что используете Entity Framework, вот пример реализации Code First, выполненной на C #.Вы можете создавать и обновлять схему с помощью миграций консоли диспетчера пакетов в Visual Studio.Я использовал Fluent API для определения отношений, так как это рекомендуется вместо альтернативы.

public class SampleContext : DbContext
{
    public SampleContext()
        : base("name=YourConnection")
    {
    }

    public DbSet<SalesOrder> SalesOrders { get; set; }
    public DbSet<CreditOrder> CreditOrders { get; set; }
    public DbSet<Invoice> Invoices { get; set; }
    public DbSet<UploadedFile> UploadedFiles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<SalesOrder>()
            .HasKey(so => so.Id);

        modelBuilder.Entity<CreditOrder>()
            .HasKey(co => co.Id);

        modelBuilder.Entity<Invoice>()
            .HasKey(i => i.Id);

        modelBuilder.Entity<UploadedFile>()
            .HasKey(u => u.Id);

        modelBuilder.Entity<UploadedFile>()
            .HasRequired(u => u.SalesOrder)
            .WithMany(s => s.UploadedFiles)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<UploadedFile>()
            .HasRequired(u => u.CreditOrder)
            .WithMany(c => c.UploadedFiles)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<UploadedFile>()
            .HasRequired(u => u.Invoice)
            .WithMany(c => c.UploadedFiles)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<UploadedFile>()
            .Property(uf => uf.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        modelBuilder.Entity<SalesOrder>()
            .Property(so => so.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        modelBuilder.Entity<CreditOrder>()
            .Property(co => co.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        modelBuilder.Entity<Invoice>()
            .Property(i => i.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        base.OnModelCreating(modelBuilder);
    }
}

// Collections of navigation properties should be included in classes for a one-to-many relationship

public class SalesOrder
{
    public int Id { get; set; }
    public string MyColumn { get; set; }
    public IList<UploadedFile> UploadedFiles { get; set; }
}

public class CreditOrder
{
    public int Id { get; set; }
    public string MyColumn { get; set; }
    public IList<UploadedFile> UploadedFiles { get; set; }
}

public class Invoice
{
    public int Id { get; set; }
    public string MyColumn { get; set; }
    public IList<UploadedFile> UploadedFiles { get; set; }
}

public class UploadedFile
{
    public int Id { get; set; }
    public SalesOrder SalesOrder { get; set; }
    public CreditOrder CreditOrder { get; set; }
    public Invoice Invoice { get; set; }
    public string FilePath { get; set; }
    public string FileType { get; set; }
}

public class SalesOrder
{
    public int Id { get; set; }
    public string MyColumn { get; set; }
    public IList<UploadedFile> UploadedFiles { get; set; }
}

public class CreditOrder
{
    public int Id { get; set; }
    public string MyColumn { get; set; }
    public IList<UploadedFile> UploadedFiles { get; set; }
}

public class Invoice
{
    public int Id { get; set; }
    public string MyColumn { get; set; }
    public IList<UploadedFile> UploadedFiles { get; set; }
}

public class UploadedFile
{
    public int Id { get; set; }
    public SalesOrder SalesOrder { get; set; }
    public CreditOrder CreditOrder { get; set; }
    public Invoice Invoice { get; set; }
    public string FilePath { get; set; }
    public string FileType { get; set; }
}
0 голосов
/ 23 октября 2018

Перед прочтением моего ответа обратите внимание на следующую информацию:

Лучший ответ можно найти в этом предыдущем посте по адресу Внешний ключ для нескольких таблиц .


Мой ответ:

См. здесь для получения дополнительной информации из документации по созданию таблиц на странице MDSN.

Дизайн, за который я пошел, дал каждой таблице собственный идентификатор как Первичный ключ .Затем я использовал таблицу UploadedFile для добавления ссылок на каждую из этих таблиц в форме Foreign Keys .

. Я создал несколько фиктивных сценариев, которые могут помочь вам в создании этих таблиц.Пожалуйста, дайте мне знать, если это поможет.Спасибо!

Сценарии SQL:

Таблица SalesOrder:

Create Table dbo.SalesOrder(
SalesOrderID int not null, identity primary key,
--enter whatever other columsn you have here
)

Таблица CreditOrder:

Create Table sbo.CreditOrder(
CreditOrderID int not null, identity primary key,
--enter whatever other columsn you have here
)

Таблица счетов:

Create Table dbo.Invoice(
InvoiceID int not null, identity primary key,
--enter whatever other column you have here
)

Таблица загруженных файлов:

Create table dbo.UploadedFile(
UploadFileID int not null identity primary key,
SalesOrderID int null Foreign Key References SalesOrder(SalesOrderID),
CreditOrderID int null Foreign Key References CreditOrder(CreditOrderID),
InvoiceID int null Foreign Key References CreditOrder(InvoiceID),
--enter whatever other columns you have here
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...