Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework Foreign Key multiple table mapping

I have this Scenario:

public class Application
{
    [Key]
    public string Code { get; set; }
}

public class Table1
{
    [Key]
    public string Table1Code { get; set; }

    [Key, ForeignKey("ApplicationObject")]
    public string Application { get; set; }
    public virtual Application ApplicationObject { get; set; }
}

public class Table2
{
    [Key]
    public string Table2Code { get; set; }

    [Key, ForeignKey("ApplicationObject")]
    public string Application { get; set; }
    public virtual Application ApplicationObject { get; set; }
}

public class Table3
{
    [Key, ForeignKey("Table1Object")]
    public string Table1Code { get; set; }
    public virtual Table1 Table1Object { get; set; }

    [Key, ForeignKey("Table2Object")]
    public string Table2Code { get; set; }
    public virtual Table2 Table2Object { get; set; }

    [Key, ForeignKey("Table1Object")]
    public string ApplicationCodeTab1 { get; set; }

    [Key, ForeignKey("Table2Object")]
    public string ApplicationCodeTab2 { get; set; }
}

In the table1 and table2 the property applicationCode must be key because i can have the same code for different application.

In the Table3 i have referenced Table1 and Table2. How Can I add Foreign Key for the ApplicationCode Property without duplicate the property?

For Example:

public class Table3
{
    [Key, ForeignKey("Table1Object")]
    public string Table1Code { get; set; }
    public virtual Table1 Table1Object { get; set; }

    [Key, ForeignKey("Table2Object")]
    public string Table2Code { get; set; }
    public virtual Table2 Table2Object { get; set; }

    [Key]
    public string ApplicationCode { get; set; }
}

The ApplicationCode property in Table3 can rapresent the Foreign Key for Table1 and Table2 in same time?

like image 537
Marco Avatar asked Oct 15 '25 10:10

Marco


1 Answers

The key is to move the ForeignKey attribute to the navigation property and specify a the foreign key columns.

Like this:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

namespace ConsoleApp6
{

    public class Application
    {
        [Key]
        public string Code { get; set; }
    }

    public class Table1
    {
        [Key]
        [Column(Order = 0)]
        public string Table1Code { get; set; }

        [Key, ForeignKey("ApplicationObject")]
        [Column(Order = 1)]
        public string Application { get; set; }
        public virtual Application ApplicationObject { get; set; }
    }

    public class Table2
    {
        [Key]
        [Column(Order = 0)]
        public string Table2Code { get; set; }

        [Key, ForeignKey("ApplicationObject")]
        [Column(Order = 1)]
        public string Application { get; set; }
        public virtual Application ApplicationObject { get; set; }
    }

    public class Table3
    {
        [Key]
        [Column(Order = 0)]
        public string Table1Code { get; set; }

        [Key]
        [Column(Order = 1)]
        public string Table2Code { get; set; }

        [Key]
        [Column(Order = 2)]
        public string ApplicationCode { get; set; }

        [ForeignKey("Table1Code,ApplicationCode")]
        public virtual Table1 Table1Object { get; set; }

        [ForeignKey("Table2Code,ApplicationCode")]
        public virtual Table2 Table2Object { get; set; }



    }
    class Db: DbContext
    {


        public DbSet<Table1> Table1 { get; set; }
        public DbSet<Table2> Table2 { get; set; }
        public DbSet<Table3> Table3 { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.OneToManyCascadeDeleteConvention>();
            base.OnModelCreating(modelBuilder);
        }

    }
    class Program
    {

        static void Main(string[] args)
        {


            Database.SetInitializer(new DropCreateDatabaseAlways<Db>());

            using (var db = new Db())
            {
                db.Database.Log = m => Console.WriteLine(m);

                db.Database.Initialize(true);


            }

            Console.ReadKey();

        }
    }
}
like image 133
David Browne - Microsoft Avatar answered Oct 17 '25 01:10

David Browne - Microsoft