Ray*_*Ray 31 c# mapping entity cascading-deletes entity-framework-4.1
我将使用外键在Employee和Team实体之间创建两个引用.所以我定义了两个实体如下
public class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
[ForeignKey("FirstTeam")]
public int FirstTeamId { get; set; }
[InverseProperty("FirstEmployees")]
public virtual Team FirstTeam { get; set; }
[ForeignKey("SecondTeam")]
public int SecondTeamId { get; set; }
[InverseProperty("SecondEmployees")]
public virtual Team SecondTeam { get; set; }
}
public class Team
{
public int Id { get; set; }
public string TeamName { get; set; }
[InverseProperty("FirstTeam")]
public virtual ICollection<Employee> FirstEmployees { get; set; }
[InverseProperty("SecondTeam")]
public virtual ICollection<Employee> SecondEmployees { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我认为理论上它是正确的,但它显示如下例外:
{"Introducing FOREIGN KEY constraint 'Employee_SecondTeam' on table 'Employees' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.\r\nCould not create constraint. See previous errors."}
Run Code Online (Sandbox Code Playgroud)
有谁能够帮我?
在此先感谢Kwon
Lad*_*nka 54
它在理论上是正确的,但SQL服务器(不是实体框架)不喜欢它,因为您的模型允许单个员工成为第一和第二团队的成员.如果Team删除,将导致同一Employee实体的多个删除路径.
如果将外键定义为必需(不可为空),则不能与首先在EF代码中使用的级联删除一起使用.
如果要避免异常,则必须使用流畅映射:
public Context : DbContext
{
public DbSet<Employee> Employees { get; set; }
public DbSet<Team> Teams { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Employee>()
.HasRequired(e => e.SecondTeam)
.WithMany(t => t.SecondEmployees)
.HasForeignKey(e => e.FirstTeamId)
.WillCascadeOnDelete(false);
...
}
}
Run Code Online (Sandbox Code Playgroud)
这将导致您在删除团队之前必须手动删除SecondTeam的成员.
| 归档时间: |
|
| 查看次数: |
22391 次 |
| 最近记录: |