私は以下の2つのモデルを持っています:
public class Person{
public virtual int Id { get; set; }
public virtual int BaseId { get; set; }
public virtual string Name { get; set; }
public virtual Employee Employee { get; set; }
}
public class Employee{
public virtual int Id { get; set; }
public virtual string Code{ get; set; }
public virtual Person Person { get; set; }
}
すべてEmployee
がですが、必ずしもPerson
すべてPerson
がであるとは限りませんEmployee
。これら2つの関係は、1対1の関係のタイプですが、非主キー列(Person.BaseId
)と目的の外部キー列(Employee.Id
)の間でこの関係を作成する必要があります。モデルのId
列Employee
は、主キーと外部キーの列です。
私はこのマッピング構成を持っています:
public override void Configure(EntityTypeBuilder<Person> builder)
{
builder.HasKey(x => x.Id);
builder.ToTable("tblPeople", "dbo");
builder
.HasOne(p => p.Employee)
.WithOne(p => p.Person)
.HasForeignKey<Employee>(p => p.Id)
.HasPrincipalKey<Person>(p => p.BaseId);
}
public override void Configure(EntityTypeBuilder<Employee> builder)
{
builder.HasKey(x => x.Id);
builder.ToTable("tblEmployees", "dbo");
}
移行を生成しようとすると、次のエラーが発生します。
'Employee.Person'と 'Person.Employee'の間の1対1の関係について、子/依存側を判別できませんでした。関係の子/依存側を識別するには、外部キープロパティを構成します。これらのナビゲーションを同じ関係の一部にすべきでない場合は、逆を指定せずに構成してください。詳細については、http://go.microsoft.com/fwlink/?LinkId = 724062を参照してください。
私はしません。この問題を解決するために、データアノテーションのアプローチを使用します。
私は解決策を見つけました、間違いは私のEntityTypeConfiguration
クラスのデザインにありました。私は次のデザインを持っていました:簡単にするために、私はコードをトリミングしました
public abstract class BaseMap<T, U> : IEntityTypeConfiguration<T> where T: BaseEntity<U>
{
public virtual void Configure(EntityTypeBuilder<T> builder)
{
builder.HasKey(x => x.Id);
}
}
public abstract class ChildBaseMap<T, U> : BaseMap<T, U> where T: ChildBaseEntity<U>
{
public virtual void Configure(EntityTypeBuilder<T> builder)//<== virtual is wrong here as I need to override the parent Configure
{
base.Configure(builder);
builder.Property(x => x.BaseId).IsRequired();
}
}
public class PersonMap : ChildBaseMap<Person, int>
{
public override void Configure(EntityTypeBuilder<Person> builder)
{
....
ただoverride
、その代わりとしてそれを定義する設定方法virtual
でのChildBaseMap
クラスは、この問題を解決します!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加