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として自動的に認識すべきではありませんか?私は何かが足りないのですか?
ありがとう!
ここでの問題は、両方のオブジェクトで相互参照を保持しているため、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への参照をスキップします。
ここでの問題は、住所と人種の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の外部キーである必要があります。
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; }
}
良い投稿があります:EFコードファーストCTP5の関連付け:パート2 –共有主キーの関連付け
慣例により、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; }
に変更する必要があります。
このようにも解決できると思います...住所はレースに関連付ける必要はないと思いましたが、レースは常に住所に関連付ける必要があります。私は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; }
}