实体框架代码优先 - 级联删除

时间:2016-03-30 12:26:01

标签: c# entity-framework

实体框架代码优先。

我正在尝试在表上实现级联删除但是收到错误

"参数@objname不明确或声称@objtype(COLUMN)错误。"

我有以下型号:

用户表:

public class User {
    public int id { get; set; }
    public List<UserSickness> Sickness { get; set; }
}

疾病表:

public class UserSickness {
    public int id { get; set; }
    public DateTime SicknessDate { get; set; }
    public List<Symptom> Symptoms { get; set; }
}

症状表:

public class Symptom {
    public int id { get; set; }
    public string Description { get; set; }
}

所以,基本上,我希望用户有一个&#34; Sick&#34;那天,能够说出他/她的症状......

同样,这就是我在实施方面遇到的问题。当我删除&#34;疾病&#34;对于特定日期,我想要一个级联删除来删除&#34;症状&#34;

我遵循了以下SO问题:

Entity Framework (EF) Code First Cascade Delete for One-to-Zero-or-One relationship

并添加了以下代码:

protected override void OnModelCreating(DbModelBuilder modelBuilder) {

// delete symptoms
modelBuilder.Entity<DatapultData.Model.UserSickness>()
.HasOptional(a => a.Symptoms)
.WithOptionalDependent()
.WillCascadeOnDelete(true);

base.OnModelCreating(modelBuilder);
}

当我添加迁移来实现它时,它会生成以下代码:

namespace Data.Migrations
{
using System;
using System.Data.Entity.Migrations;

public partial class addedcascadingdeleteonsymptoms : DbMigration
{
    public override void Up()
    {
        DropForeignKey("dbo.Symptoms", "UserSickness_id", "dbo.UserSicknesses");
        DropIndex("dbo.Symptoms", new[] { "UserSickness_id" });
        RenameColumn(table: "dbo.UserSicknesses", name: "UserSickness_id", newName: "Symptoms_id");
        CreateIndex("dbo.UserSicknesses", "Symptoms_id");
        AddForeignKey("dbo.UserSicknesses", "Symptoms_id", "dbo.Symptoms", "id", cascadeDelete: true);
        DropColumn("dbo.Symptoms", "UserSickness_id");
    }

    public override void Down()
    {
        AddColumn("dbo.Symptoms", "UserSickness_id", c => c.Int());
        DropForeignKey("dbo.UserSicknesses", "Symptoms_id", "dbo.Symptoms");
        DropIndex("dbo.UserSicknesses", new[] { "Symptoms_id" });
        RenameColumn(table: "dbo.UserSicknesses", name: "Symptoms_id", newName: "UserSickness_id");
        CreateIndex("dbo.Symptoms", "UserSickness_id");
        AddForeignKey("dbo.Symptoms", "UserSickness_id", "dbo.UserSicknesses", "id");
    }
}

}

但是,当我做一个&#34; update-database&#34;我收到以下错误,我不明白如何解决..

Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong.

任何人都可以建议我做错了吗?

由于

2 个答案:

答案 0 :(得分:0)

你的数据库还在吗?如果删除数据库,则会发生这种情况。 如果未删除,请尝试删除迁移脚本,添加迁移(通过NuGet)并更新数据库。

答案 1 :(得分:0)

我认为你的问题存在于关系中...你如何配置这个表?您可以在这些类之间的关系中添加一个虚拟类,如导航属性

public class UserSickness {
    public int id { get; set; }
    public DateTime SicknessDate { get; set; }
    public List<Symptom> Symptoms { get; set; }

    // Navigation property
    public virtual User UserAsociated { get; set; }
}

public class Symptom {
    public int id { get; set; }
    public string Description { get; set; }

    // Navigation property
    public virtual UserSickness UserSicknessAsociated { get; set; }
}

然后,将配置更改为

protected override void OnModelCreating(DbModelBuilder modelBuilder) {

// delete symptoms
modelBuilder.Entity<DatapultData.Model.UserSickness>()
.HasOptional(a => a.Symptoms)
.WithRequired(b => b.UserSicknessAsociated)//Update this line
.WillCascadeOnDelete(true);

base.OnModelCreating(modelBuilder);
}

为了避免类似的错误,你应该为User类做同样的事情。

也许这可以解决ambiguos列名,显示在错误消息