0

モデルにエラーがあると思いますが、それが何であるかわかりません。

まずエラー

The INSERT statement conflicted with the FOREIGN KEY constraint 
"FK_dbo.ProjectDocAccess_dbo.ProjectDoc_ProjectDocAccessID". The conflict 
occurred in database "dbname", 
table "dbo.ProjectDoc", column 'ProjectDocID'.

モデル(ProjectDocAccessトリミング)

public class ProjectDocAccess
{
    public int ProjectDocAccessID { get; set; }
    public int ProjectDocID { get; set; }

    public virtual ProjectDoc ProjectDoc { get; set; }
}

モデル(ProjectDocトリミング)

public class ProjectDoc
{
    public int ProjectDocID { get; set; }
    public int ProjectID { get; set; }

    public ProjectDocAccess ProjectDocAccess { get; set; }
    public Project Project { get; set; } 
}

流暢な API マッピング

        modelBuilder.Entity<ProjectDocAccess>()
            .HasRequired(p => p.ProjectDoc).WithOptional()
            .WillCascadeOnDelete(true);

テーブルに新しいレコードを挿入しようとするとProjectDocAccess、フィールドに値を挿入する必要がありProjectDocAccessIDます。私の他のすべてのモデルでは、この自動インクリメント. 何が間違っているのかわかりません。ヘルプ?

アップデート

私が選択した答えに基づいています。これは私がそれを修正するためにしたことです。

流暢な API マッピングを完全に削除しました。

ProjectDocAccessモデルを次のように更新しました

 public class ProjectDocAccess
 {
    [Key, ForeignKey("ProjectDoc")]
    public int ProjectDocAccessID { get; set; }

    public virtual ProjectDoc ProjectDoc { get; set; }
 }
4

2 に答える 2

1

まず、このような問題が発生した場合は、生成された移行ファイルを確認する必要があります (または、移行ファイルがない場合は有効にするだけです)。生成されたテーブル/マッピングの「上位レベル」の形式で表示されます。

問題は、「1 対 1」の関係があり、ProjectDocAccesstoProjectDocが pk -> pk にマップされていることです。コードを最初に作成する唯一のサポートされている方法であるため、これらの場合はコードが自動的にそれを行いますone to one

したがって、あなたProjectDocAccessIDは常に ==the sameとしてマップされますProjectDocID

ProjectDocID自動生成されますが、アクセス ID を自分で一致させる必要があります。(自動化できると思いますが、厳密にはデータベース用語ではそうではありません)。

したがって、物事を自動生成することはできません。principal 「オプション」があるテーブル からコピーする必要があります。

現在のエンティティではそれがそのままですが、再配置することもできます (ただし、1 対 1 を作成するのは難しく、正しく行わないと問題が発生する可能性があります)。

FK-sのみを使用して作成するオプションがありますone to one(これにより、「アクセス」テーブルに「独立した」主キーを配置できます)-ただし、SQLを手動で注入する必要がありますCONSTRAINT-たとえば、このページを参照してください- http://weblogs. asp.net/manavi/archive/2011/05/01/associations-in-ef-4-1-code-first-part-5-one-to-one-foreign-key-associations.aspx

于 2013-04-27T20:29:35.697 に答える
0

ProjectDocAccessID をデータベース (Identity 列) によって生成する場合は、次DatabaseGeneratedのように、そのプロパティを属性で装飾する必要があります。

[DatabaseGenerated(DatabaseGenerationOption.Identity)]
public int ProjectDocAccessID { get; set; }

Andrei が指摘したように、[Key]属性で装飾する必要があるかもしれません。

ソース: http://msdn.microsoft.com/en-US/data/jj591583

于 2013-04-27T20:32:02.890 に答える