EF CodeFist 多重外键约束

本文探讨了在EF CodeFirst中遇到多重外键约束导致的循环或多重级联路径异常问题。解决方案包括使用Fluent API去除外键约束的级联删除规则,以及利用InverseProperty特性明确关系,避免生成额外的外键。
对于多重外键的概念,请参考 Sql 多重外键约束 一章


以一个部门类定义有中正副两个管理者的情况为例

//部门类定义
public class Department
{
	public int ID { get; set; }

	public string Name { get; set; }

	public int PrimaryManagerID { get; set; } //正管理者外键

	public virtual Manager PrimaryManager { get; set; } //正管理者导航

	public int SecondManagerID { get; set; } //副管理者外键

	public virtual Manager SecondManager { get; set; } //副管理者导航
}

//管理者类定义
public class Manager
{
	public int ID { get; set; }

	public string Name { get; set; }

	public virtual ICollection<Department> PrimaryDepartments { get; set; } //正职部门导航

	public virtual ICollection<Department> SecondDepartments { get; set; } //副职部门导航
}


这样的定义会使EF产生一个异常:
将 FOREIGN KEY 约束 'FK_dbo.Department_dbo.Manager_SecondMana

EF6(Entity Framework 6)是在.NET框架中用于数据访问的一个ORM(Object-Relational Mapping)工具,它支持Code First设计模式,即基于代码生成数据库结构。在约束的设置上,Code First通常通过数据模型(DbContext、实体类和导航属性)来表示。 当你有两张关联表时,例如有一个`Orders`表和一个`Customers`表,`Orders`表有一个字段指向`Customers`表,你可以这样做: 1. 首先,在`Customer`类中声明一个导航属性,比如`Orders`: ```csharp public class Customer { public int Id { get; set; } public string Name { get; set; } public ICollection<Order> Orders { get; set; } // Navigation property for related orders } ``` 2. 然后,在`Order`类中添加一个引用到`Customer`: ```csharp public class Order { public int Id { get; set; } public int CustomerId { get; set; } // Foreign key to Customer's Id public Customer Customer { get; set; } // Navigation property } // In Fluent API (for EF6), you would define the relationship like this: protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Order>() .HasRequired(o => o.Customer) // Using Required() here assumes a foreign key exists in database or will be created. .WithMany(c => c.Orders) .HasForeignKey(o => o.CustomerId); } ``` 在这个例子中,`HasForeignKey`方法指定了`CustomerId`字段作为。当创建数据库迁移并应用到数据库时,EF会自动根据这些配置生成约束
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值