简体   繁体   中英

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?

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();

        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM