32

親子関係のある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.
 }

プロジェクトクラスは次のとおりです。

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

VisualStudio2012でEF4.3.1を使用しています

私はしばらくの間これに頭を悩ませてきました、そしてすべてのフォーラムとSOの答えは私がすでに持っている列順序注釈を追加することを提案します。 私は明らかな何かが欠けていますか?

ここまで読んでいただきありがとうございます-)

4

4 に答える 4

16

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

EntityFramework4.xおよび.NETFramework4.5の既知の問題

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

.NET4.5でEF4.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アセンブリからの新しい注釈を使用する場合、それらはコードファーストによって処理されません。

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

  • ComplexType
  • DatabaseGenerated
  • DatabaseGeneratedOption
  • 外部キー
  • InverseProperty
  • MaxLength
  • MinLength
  • NotMapped
  • テーブル

その時点で、私のデータプロジェクトはVS2012で新しく作成され、デフォルトで.Net 4.5を対象としており、ソリューション内の残りのプロジェクトはVS2010から移行されて.Net4.0を対象としていることに気付きました。そこで、すべてのプロジェクトを.Net 4.5を対象とするように更新し、EntityFramework5.0のプレリリースを入手しました。

最初にプロジェクトをNet4.5に更新し、その後EFを5.0に更新してください。そうしないと、永遠に嫌われ、多くのバニーが死んでしまいます。

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

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

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

targetFrameworkを「net45」に変更しましたが、移行によって期待される動作が得られます。パッケージを使用してnugettarget.Net 4.5を取得するためのより良い方法があると思いますが、それが私にとってはうまくいきました。

これにより、誰かが壁に頭をぶつけてしまうのを防ぐことができれば幸いです。

于 2012-08-11T11:46:07.750 に答える
10
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")]

于 2015-09-22T08:57:54.793 に答える
6

バニーが死んでいる人のための修正は次のとおりです(.Net4.5に更新する前にEF5.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>

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

于 2012-10-10T16:49:53.080 に答える
2

私はを使用して同じ解決策に到達することができました

PM> Install-Package EntityFramework -Pre

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

于 2013-01-12T14:42:02.267 に答える