asp.net - 如何使用另一个表中的列来引用两个表 - 实体框架
问题描述
根据上图,我有一个要求,表 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)来实现?
解决方案
对我来说似乎工作正常:
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();
}
}
}
推荐阅读
- javascript - 通过json访问一个URL,可以通过提供User/Pass在chrome中打开
- internet-explorer - 基于处理器架构编辑/安装注册表文件 (.reg)
- python - Python在文件中匹配后替换单词
- excel - 在 Outlook 中粘贴 Excel 范围
- machine-learning - 如何检查文本是否有信息请求
- sql - 需要帮助回答有关 sql 数据完整性的问题
- python - 打印嵌套字典中的数字产品
- javascript - 如何使用 ES6 Javascript 类验证和显示表单数据
- github - github克隆分支和合并过程
- c# - 如何使用 selenium webdriver 自动化 Kendo UI 下拉菜单?