2016-03-30 16 views
0

エンティティフレームワークコードファースト。私は、エラーをカスケードがテーブルの上に削除を実装しようとしているが、取得していますEntity Frameworkコードファースト - カスケード削除

「のいずれかのパラメータ@objnameがあいまいであるか主張@objtype(COLUMN)が間違っています。」

I以下のモデルがあります:

Aユーザー表:

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

A酔い表:

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

A症状表:基本的にはそう

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

、 、私はユーザーが欲しい「病気」の日があり、その症状が何であったかを言うことができます。

同様に、これが実装上の問題です。

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

、次のコードを追加しました:私は、特定の日付の「病気」を削除すると私は、カスケードは、私は、次のSOの質問に従っている

「症状」を削除し、削除したい

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

}

しかし、私は「更新データベース」を行うとき、私は私が解決する方法を理解していない、次のエラーが表示されます。..

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

誰もが私が間違っているの何お勧めできます?

ありがとうございました

答えて

0

あなたのDBはまだありますか?これは、データベースが削除された場合に発生します。 削除されていない場合は、移行スクリプトの削除、Add-Migration(NuGet経由)、データベースの更新をお試しください。

+0

エラーメッセージに示された...私も「SicknessId」と「SyptomId」に、すべての「ID」フィールドの名前を変更しようとしています同じエラーが発生する –

+0

私のコメントが更新されました。これをチェックしてください。これは私のために働く。 –

+0

それは意味をなさない。移行スクリプトを削除すると、「update-database」が実行されることはありませんか? –

0

あなたの問題は関係にあると思います...どのようにこのテーブルを設定しましたか?あなたは

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

、同様のエラーを避けるために設定を変更し、その後

ナビゲーションプロパティのように、このクラス間の関係に
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; } 
} 

を仮想クラスを追加することができ、あなたは、ユーザーのために同じことを行う必要がありますクラス。

多分これがambiguos列名を解決できるが、はい、データベースがまだそこにある

+0

提案してくれてありがとうございました...同じことを試みて同じエラーが発生しました:( –

+0

答えが更新され、WithRequired()のWithOptionalDependent()を変更しようとしました –

+0

UserSicknessAsociatedはbで利用できません:(通常の.Add 、.AddRangeなど –

関連する問題