ContactテーブルのSpouseIdからIdへの外部キーを参照しようとしています。これを行うための構文は何ですか?例が見つからないようです。ありがとう。
私はこのようなクラスを持っています:
public class Contact
{
public int Id {get;set;}
public string Name {get;set;}
public int? SpouseId {get;set;}
}
EDIT1リンク Joel CunninghamとMortezaからの回答によって提供されるコードごとに、追加のコードを追加しました。
ContactMap.cs
public partial class ContactMap : EntityTypeConfiguration<Contact>
{
public ContactMap()
{
this.ToTable("Contact");
this.HasKey(c => c.Id);
this.HasOptional(c => c.Spouse)
.WithMany()
.IsIndependent()
.Map(m => m.MapKey(fk => fk.Id, "SpouseId"));
}
}
MyObjectContext.cs
public class MyObjectContext : DbContext, IDbContext
{
public DbSet<Contact> Contacts {get;set;}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Configurations.Add(new ContactMap());
}
}
注:また、ContactクラスのSpouseプロパティに「[ForeignKey( "SpouseId")]」属性を追加しました。残念ながら、「シーケンスには複数の一致する要素が含まれています」と表示され続けます。
EDIT2:以下のMortezaの答えは正しいです。要約すると、自己参照の外部キーについては、プロパティを「[ForeginKey( "SpouseId")」としてマークすることができます。OR以下の流APIなAPIの例を使用します。コメントは私のユニットテストによって引き起こされましたEFは正しい方法でdbを生成しました良い link where Craig Stuntz が自動キーと自己参照外部キーの理由を説明しました「依存する操作の有効な順序を特定できません」というエラーが発生する可能性があります。これが私の問題であると考えています。
このような何かが動作します:
public class Contact
{
public int Id {get;set;}
public string Name {get;set;}
public int? SpouseId {get;set;}
[ForeignKey("SpouseId")]
public Contact Spouse {get;set;}
}
ForeignKeyAttributeは、CTP5アセンブリによってSystem.ComponentModel.DataAnnotations
に追加されました。
CTP5のバグにより、Independent Self Referencing Associationsを作成すると例外がスローされます。回避策は、代わりにForeign Key Associationsを使用することです(常に推奨されます)。
必要に応じて、流れるようなAPIを使用してこれを実現することもできます。
public class Contact
{
public int Id { get; set; }
public string Name { get; set; }
public int? SpouseId { get; set; }
public Contact Spouse { get; set; }
}
public class Ctp5Context : DbContext
{
public DbSet<Contact> Contacts { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Contact>()
.HasOptional(c => c.Spouse)
.WithMany()
.HasForeignKey(c => c.SpouseId);
}
}
モデルの操作:
using (var context = new Ctp5Context())
{
Contact contact = new Contact()
{
Name = "Morteza",
Spouse = new Contact()
{
Name = "Code-First"
}
};
context.Contacts.Add(contact);
context.SaveChanges();
}
[Table("Move")]
public class Move
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long ID { get; set; }
public long? ParentID { get; set; }
[InverseProperty("Children")]
public virtual Move Parent { get; set; }
public virtual ICollection<Move> Children { get; set; }
}
また、ナビゲーションプロパティSpouse
は、不要なJOINクエリを回避するために仮想にする必要があります。
public virtual Contact Spouse { get; set; }