web-dev-qa-db-ja.com

ColumnAttributeまたはHasKeyメソッドを使用して、複合主キーの順序を指定します

親子関係を持つ2つのオブジェクトで複合主キーを使用しようとしています。新しい移行を作成しようとするたびに、エラーが発生します。

タイプ 'Models.UserProjectRole'の複合主キーの順序を決定できません。 ColumnAttributeまたはHasKeyメソッドを使用して、複合主キーの順序を指定します。

エラーが示唆するように、アノテーションColumn (Order = X)を追加しますが、キーアノテーションを持つフィールドを1つだけ残さない限り、エラーはまだそこにあり、消えません。ここに私のオブジェクトがあります:

public class UserProjectRole
{
    [Key, Column(Order = 0),DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid UserProjectRoleID { get; set; }

    [Key, Column (Order = 1)]
    public Guid ProjectID { get; set; }

    [ForeignKey("ProjectID")]
    public Project Project { get; set; }

    public Guid AppUserGuid { get; set; }

    // followed by a number of unrelated String fields.
 }

Projectクラスは次のとおりです。

public class Project: Base
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ProjectID { get; set; }

    public virtual ICollection<UserProjectRole> UserRoles { get; set; }

    // followed by a number of unrelated String fields.

}

DBContextの一部を次に示します。

public class SiteContext : DbContext
{

    public DbSet<Project> Projects { get; set; }

    public DbSet<UserProjectRole> UserProjectRoles { get; set; }
}

私はEF 4.3.1でVisualStudio 2012にいます

私はしばらくこれに頭を打ち続けており、すべてのフォーラムとSO回答は私がすでに持っている列順序の注釈を追加することを提案します。明らか???

これまで読んでくれてありがとう-)

31
trailmax

さまざまなことをいじり、テストするのに多くの時間がかかりました。最初から同様のデータ構造を持つ新しいVanillaプロジェクトを作成することにしたまで、私は無知でした。そして、NuGetからEntityFrameworkをインストールすると、次のメッセージが表示されました。

Entity Framework 4.xおよび.NET Framework 4.5の既知の問題

Entity Framework 4.1から4.3では、EntityFramework AssemblyのSystem.ComponentModel.DataAnnotations名前空間に追加のデータ注釈が含まれていました。 .NET 4.5では、これらの注釈は、System.ComponentModel.DataAnnotations.dllアセンブリのSystem.ComponentModel.DataAnnotations.Schema名前空間の.NET Frameworkの一部に移動されました。 EF 4.xを使用しており、.NET 4.5をターゲットにしている場合、異なるアセンブリで同じ名前の2つのデータ注釈が作成されます。 .NET Frameworkの注釈は別の名前空間にあるため、この競合を回避するために型転送を使用できませんでした。

.NET 4.5でEF 4.xを使用することは可能ですが、EF 5の最新のプレリリースバージョンを使用することをお勧めします。影響を受けるデータアノテーションを使用していない場合、コードに影響はありません。 C#プロジェクトでデータ注釈を使用している場合は、extern修飾子を使用して、コードでEntityFramework.dllからの注釈を使用できるようにします( http://msdn.Microsoft.com/en-us/library/e59b22c5 (v = VS.80).aspx )。 .NET 4.5のSystem.ComponentModel.DataAnnotations.dllアセンブリの新しい注釈を使用する場合、それらはCode Firstによって処理されません。

影響を受ける注釈は次のとおりです。

  • ComplexType
  • DatabaseGenerated
  • DatabaseGeneratedOption
  • 外部キー
  • InverseProperty
  • MaxLength
  • 最小長
  • NotMapped
  • テーブル

その時点で、データプロジェクトはVS2012で新たに作成され、デフォルトで.Net 4.5を対象としており、ソリューションの残りのプロジェクトはVS2010から移行され、.Net 4.0を対象にしていることに気付きました。そのため、すべてのプロジェクトを更新して.Net 4.5をターゲットにし、EntityFramework 5.0のプレリリースを取得しました。

最初にプロジェクトをNet4.5に更新してから、EFを5.0に更新してください。そうしないと、永遠にあなたを憎み、多くのバニーが死にます。

このスクリーンキャスト はEF5.0に更新するための優れたスターターです

その時点でエラーはなくなりましたが、別のエラーが発生していました。ほんの数秒前に構成をセットアップしたにもかかわらず、移行構成が見つからなかったため、移行を追加できませんでした。再びNuGetをいじり、広告を再インストールするパッケージをアンインストールしました。次に、packages.configで次のような行を見ました。

package id="EntityFramework" version="5.0.0-rc" targetFramework="net40" 

TargetFrameworkを「net45」に変更しましたが、現在、移行から期待される動作が得られています。パッケージでnugetターゲット.Net 4.5を取得するより良い方法があると思いますが、それは私にとってはうまくいきました。

これで誰かが頭を壁にぶつけて救うことを願っています。

16
trailmax
_    public class UserProjectRole
    {
        [Key, Column (Order = 0)]
        public Guid UserProjectRoleID { get; set; }

    [Key, Column (Order = 1)]
    [ForeignKey("Project")]
    public Guid ProjectID { get; set; }

    [Required]
    public Project Project { get; set; }

    public Guid AppUserGuid { get; set; }

    // followed by a number of unrelated String fields.
 }

public class Project: Base
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ProjectID { get; set; }

    public virtual ICollection<UserProjectRole> UserRoles { get; set; }

    // followed by a number of unrelated String fields.

}

    public class SiteContext : DbContext
{

    public DbSet<Project> Projects { get; set; }

    public DbSet<UserProjectRole> UserProjectRoles { get; set; }
}
_

特に、_[Required]_の上にある_public Project Project {get; set;}_でこれを試してください。

これが機能しない場合は、もう一度試して、[Key, Column (Order = 1)]の上にある[ForeignKey("ProjectID")]を削除してください

9
Abed G.

これは、死んだバニー(.Net 4.5に更新する前にEF 5.0に更新した)の修正です。

Csprojファイルで、変更します

<Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll</HintPath>
</Reference>

<Reference Include="EntityFramework">
  <HintPath>..\packages\EntityFramework.5.0.0\lib\net45\EntityFramework.dll</HintPath>
</Reference>

あなたがそれを知っているとき、かなり明白です....

6

私は同じ解決策に来ることができました

PM>インストールパッケージEntityFramework -Pre

http://weblogs.asp.net/scottgu/archive/2012/12/11/entity-framework-6-alpha2-now-available.aspx

2
James Fleming