首页 > 解决方案 > 如何使用另一个表中的列来引用两个表 - 实体框架

问题描述

在此处输入图像描述

根据上图,我有一个要求,表 C 需要同时引用表 A 和表 B。

注意: RefId在 Table_C 中是表 A 和 B 的引用键。

请参考代码片段,

表_A类

public partial class Table_A
{
   public int Id { get; set; }
   public string Name { get; set; }
   public virtual ICollection<Table_C> Table_C { get; set; }
}

Table_B 类

public partial class Table_B
{
   public int Id { get; set; }
   public string Name { get; set; }
   public virtual ICollection<Table_C> Table_C { get; set; }
}

Table_C 类

public partial class Table_C
{
   public int Id { get; set; }
   public int RefId { get; set; }
   public Type Type {get; set; }
   public virtual Table_A Table_A { get; set; }
   public virtual Table_B Table_B { get; set; }
}

流畅的 API

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Table_1>()
        .Property(e => e.Name)
        .IsFixedLength();

    modelBuilder.Entity<Table_1>()
        .HasMany(e => e.Table_3)
        .WithRequired(e => e.Table_1)
        .HasForeignKey(e => e.RefId)
        .WillCascadeOnDelete(false);

    modelBuilder.Entity<Table_2>()
        .Property(e => e.Name)
        .IsFixedLength();

    modelBuilder.Entity<Table_2>()
        .HasMany(e => e.Table_3)
        .WithRequired(e => e.Table_2)
        .HasForeignKey(e => e.RefId)
        .WillCascadeOnDelete(false);
}

但是,当尝试使用上面显示的代码实现此要求时,会发生以下错误。

INSERT 语句与 FOREIGN KEY 约束“FK_dbo.TableC.TableA_Id”冲突。冲突发生在数据库“TestDB”、表“dbo.TableA”、列“Id”中。该语句已终止

如何使用 Entity Framework 6(SQL Server 2014,.NET framework 4.6.1)来实现?

标签: asp.net.netsql-serverentity-frameworkentity-framework-6

解决方案


对我来说似乎工作正常:

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

namespace Ef6Test
{

    public partial class Table_A
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Table_C> Table_C { get; } = new HashSet<Table_C>();
    }
    //Table_B Class
    public partial class Table_B
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Table_C> Table_C { get; } = new HashSet<Table_C>();
    }
    //Table_C Class
    public partial class Table_C
    {
        public int Id { get; set; }
        public int RefId { get; set; }
        public string Type { get; set; }

        public virtual Table_A Table_A { get; set; }

        public virtual Table_B Table_B { get; set; }
    }

    class Db: DbContext
    {
        public DbSet<Table_A> Table_A { get; set; }
        public DbSet<Table_B> Table_B { get; set; }
        public DbSet<Table_C> Table_C { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {


            modelBuilder.Entity<Table_A>()
                .HasMany(e => e.Table_C)
                .WithRequired(e => e.Table_A)
                .HasForeignKey(e => e.RefId)
                .WillCascadeOnDelete(false);

            modelBuilder.Entity<Table_B>()
                .HasMany(e => e.Table_C)
                .WithRequired(e => e.Table_B)
                .HasForeignKey(e => e.RefId)
                .WillCascadeOnDelete(false);
        }
    }


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

                var a = new Table_A();
                var b = new Table_B();
                var c = new Table_C();

                a.Table_C.Add(c);
                b.Table_C.Add(c);

                db.Table_A.Add(a);
                db.Table_B.Add(b);
                db.Table_C.Add(c);

                db.SaveChanges();
            }
            Console.ReadKey();

        }
    }
}

推荐阅读