web-dev-qa-db-ja.com

EF4.1-モデルの関係

RCバージョンのEF4.1を使用して、簡単なASP.NET MVC3アプリケーションを作成しようとしています。私は2つのモデルを持っています:

public class Race
{
    public int RaceId { get; set; }
    public string RaceName { get; set; }
    public string RaceDescription { get; set; }
    public DateTime? RaceDate { get; set; }
    public decimal? Budget { get; set; }
    public Guid? UserId { get; set; }
    public int? AddressId { get; set; }

    public virtual Address Address { get; set; }
}

そして

public class Address
{
    public int AddressId { get; set; }
    public string Street { get; set; }
    public string StreetCont { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }

    public virtual Race Race { get; set; }
}

新しい種族を挿入しようとすると、次のエラーが発生します。

タイプ 'rcommander.Models.Race'と 'rcommander.Models.Address'の間の関連付けの主な終わりを判別できません。この関連付けの主な目的は、リレーションシップフルーエントAPIまたはデータアノテーションのいずれかを使用して明示的に構成する必要があります。

RaceIdをRacesテーブルの主キーとして認識し、AddressIdをAddressesテーブルへのFKとして自動的に認識すべきではありませんか?私は何かが足りないのですか?

ありがとう!

21
Mike

ここでの問題は、両方のオブジェクトで相互参照を保持しているため、EntityFrameworkが主キーの場所を認識できないことです。何を達成したいかわからないので、次のような提案をするかもしれません。

public class Race
{
  public int RaceId { get; set; }
  public string RaceName { get; set; }
  public string RaceDescription { get; set; }
  public DateTime? RaceDate { get; set; }
  public decimal? Budget { get; set; }
  public Guid? UserId { get; set; }

  public int? AddressId { get; set; }
  public virtual Address Address { get; set; }
}

public class Address
{
  public int AddressId { get; set; }
  public string Street { get; set; }
  public string StreetCont { get; set; }
  public string City { get; set; }
  public string State { get; set; }
  public string ZipCode { get; set; }
}

2番目のエンティティのRaceへの参照をスキップします。

21
tpeczek

ここでの問題は、住所と人種の1:1の関係です。おそらくそれを1:Nとしてマップしたいので、アドレスを次のように変更する必要があります。

public class Address
{
  public int AddressId { get; set; }
  public string Street { get; set; }
  public string StreetCont { get; set; }
  public string City { get; set; }
  public string State { get; set; }
  public string ZipCode { get; set; }

  public virtual ICollection<Race> Races { ... }
}

1:1を使用する場合、RaceでAddressIdを使用することはできませんが、エンティティフレームワークは1:1を達成できるのは主キーのみであるため、AddressのAddressIdはRaceの外部キーである必要があります。

18
Ladislav Mrnka

1対1の関係の場合、2番目のクラスに「[required]」属性を追加する必要があります。下記参照:

public class Race
{
  public int RaceId { get; set; }
  public string RaceName { get; set; }
  public string RaceDescription { get; set; }
  public DateTime? RaceDate { get; set; }
  public decimal? Budget { get; set; }
  public Guid? UserId { get; set; }

  public int? AddressId { get; set; }
  public virtual Address Address { get; set; }
 }

public class Address
{
 public int AddressId { get; set; }
 public string Street { get; set; }
 public string StreetCont { get; set; }
 public string City { get; set; }
 public string State { get; set; }
 public string ZipCode { get; set; }

 [required]
 public Race Race { get; set; }

}
8
Ehsan

良い投稿があります:EFコードファーストCTP5の関連付け:パート2 –共有主キーの関連付け

http://weblogs.asp.net/manavi/archive/2010/12/19/entity-association-mapping-with-code-first-one-to-one-shared-primary-key-associations。 aspx

5
Roeland Jimenez

慣例により、Idを主キーとして認識します。だからあなたがする必要があること:

public class Race
{
    [Key]
    public int RaceId { get; set; }
    public string RaceName { get; set; }
    public string RaceDescription { get; set; }
    public DateTime? RaceDate { get; set; }
    public decimal? Budget { get; set; }
    public Guid? UserId { get; set; }
    public int? AddressId { get; set; }

    public virtual Address Address { get; set; }
}
and

public class Address
{
    [Key]
    public int AddressId { get; set; }
    public string Street { get; set; }
    public string StreetCont { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }

    [ForeignKey("RaceId")] // Maybe telling it what the ForeignKey is will help?
    public virtual Race Race { get; set; }
}

[Key]属性は、それがPrimaryKeyであることを示します

これが不要な場合は、主キーの名前を単にpublic int Id {get; set; }に変更する必要があります。

4
Yngve B-Nilsen

このようにも解決できると思います...住所はレースに関連付ける必要はないと思いましたが、レースは常に住所に関連付ける必要があります。私はPatientsand Incidentsで同じ問題を抱えていましたが、実際には外部キーと同じであるInversePropertyで解決しましたが、方向は逆です。

public class Race
{
  public int RaceId { get; set; }
  public string RaceName { get; set; }
  public string RaceDescription { get; set; }
  public DateTime? RaceDate { get; set; }
  public decimal? Budget { get; set; }
  public Guid? UserId { get; set; }

  public int AddressId { get; set; }

  [ForeignKey("AddressId")]
  public virtual Address Address { get; set; }
 }

public class Address
{
 public int AddressId { get; set; }
 public string Street { get; set; }
 public string StreetCont { get; set; }
 public string City { get; set; }
 public string State { get; set; }
 public string ZipCode { get; set; }

 public int? RaceId { get; set; }
 [InverseProperty("RaceId")]
 public Race Race { get; set; }

}
0