1 : 0..1 관계에 문제가 있습니다. 오류가 발생합니다 : 'TestContext.Environments'의 엔티티가 'PortalEnvironment_BaEnvironment'관계에 참여합니다. 0 관련 'PortalEnvironment_BaEnvironment_Target'을 찾았습니다. 1 'PortalEnvironment_BaEnvironment_Target'이 (가) 필요합니다.X의 엔티티가 Y 관계에 참여합니다. 0 관련 타겟이 발견되었습니다. 1 대상이 예상됩니다.
나는 Table-Per-Type을 구현하는 3 개의 테이블을 가지고 있습니다.
CREATE TABLE dbo.EnvironmentBase(
EnvironmentId int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED
);
CREATE TABLE dbo.BAEnvironment(
EnvironmentId int NOT NULL PRIMARY KEY CLUSTERED,
CONSTRAINT FK_BAEnvironment_EnvironmentBase FOREIGN KEY(EnvironmentId)
REFERENCES dbo.EnvironmentBase (EnvironmentId) ON DELETE CASCADE
);
CREATE TABLE dbo.PortalEnvironment(
EnvironmentId int NOT NULL PRIMARY KEY CLUSTERED,
BAEnvironmentId int NOT NULL,
CONSTRAINT FK_PortalEnvironment_BAEnvironment FOREIGN KEY(BAEnvironmentId)
REFERENCES dbo.BAEnvironment (EnvironmentId) ,
CONSTRAINT FK_PortalEnvironment_EnvironmentBase FOREIGN KEY(EnvironmentId)
REFERENCES dbo.EnvironmentBase (EnvironmentId) ON DELETE CASCADE
);
내 문제를 통해 작업하는 동안, 나는 Option2Mimic을 활용 One to Zero/One Relationship in EF를 도와의 다음 문서를 중고 (독립 협회 : 아래
내가 내 테스트에 사용하고있는 SQL/C# 코드의 단순화 된 버전입니다) 그게 내 상황에 가장 적합한 것으로 보인다. 그러나 위에 표시된 오류가 발생합니다.포항 강판은 :
public abstract partial class Environment
{
public int Id { get; set; } // EnvironmentId (Primary key)
public Environment()
{
InitializePartial();
}
partial void InitializePartial();
}
public partial class BaEnvironment : Environment
{
// MAY have a portal environment
public virtual PortalEnvironment PortalEnvironment { get; set; } // PortalEnvironment.FK_PortalEnvironment_BAEnvironment
public BaEnvironment()
{
InitializePartial();
}
partial void InitializePartial();
}
public partial class PortalEnvironment : Environment
{
// MUST have a BAMS environment
public virtual BaEnvironment BaEnvironment { get; set; } // PortalEnvironment.FK_PortalEnvironment_BAEnvironment
public PortalEnvironment()
{
InitializePartial();
}
partial void InitializePartial();
}
구성을 :
public partial class EnvironmentMap : EntityTypeConfiguration<Environment>
{
public EnvironmentMap() : this("dbo")
{
}
public EnvironmentMap(string schema)
{
ToTable("EnvironmentBase", schema);
HasKey(x => x.Id);
Property(x => x.Id).HasColumnName(@"EnvironmentId")
.HasColumnType("int").IsRequired()
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Property(x => x.Ordinal).HasColumnName(@"Ordinal")
.HasColumnType("tinyint").IsRequired();
InitializePartial();
}
partial void InitializePartial();
}
public partial class BaEnvironmentMap : EntityTypeConfiguration<BaEnvironment>
{
public BaEnvironmentMap() : this("dbo")
{
}
public BaEnvironmentMap(string schema)
{
ToTable("BAEnvironment", schema);
InitializePartial();
}
partial void InitializePartial();
}
public partial class PortalEnvironmentMap : EntityTypeConfiguration<PortalEnvironment>
{
public PortalEnvironmentMap() : this("dbo")
{
}
public PortalEnvironmentMap(string schema)
{
ToTable("PortalEnvironment", schema);
//Property(x => x.BaEnvironmentId).HasColumnName(@"BAEnvironmentId")
.HasColumnType("int").IsRequired()
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
// Foreign keys
HasRequired(a => a.BaEnvironment).WithOptional(b => b.PortalEnvironment)
.Map(c => c.MapKey(@"BAEnvironmentId"));
InitializePartial();
}
partial void InitializePartial();
}
난 그냥 PortalEnvironment와 BAEnvironment 사이의 관계는 TPT 어떤 문제가 될 것 같지 않습니다. BAEnvironment와 PortalEnvironment 사이의 관계는 1 : 0..1이므로 BAEnviroment는 연관된 PortalEnvironment를 가질 수 있지만 모든 PortalEnvironments는 연관된 BAEnvironment를 가져야합니다.
내 문제는 아주 단순 해 보였지만 앞뒤로 가고 유창한 API 조합으로 해결했습니다.
나는 앱 개발자가 아니라 DBA임을 주목할 가치가있다. 다른 사람들이 그렇게하지 않을 것이기 때문에 그냥 붙어 있어야합니다.
우선 나는 그것이 흥미로운 일 열이있는 테이블 찾기, 왜? – Sami
왜 이러한 엔터티간에 외래 키 _ 및 _ 상속 관계가 있습니까? 그건 . . . 별난. –
@David PortalEnvironment와 BAEnvironment에는 동일한 기능이 있지만 각각에는 다른 속성과 다른 많은 속성이 있으므로 상속이 있습니다. 실제로 TPT 클래스가 몇 가지 더 있습니다.이 두 클래스 간의 관계가 문제이므로 여기에 중점을 둘 것입니다. 상속 자체에 문제가 없습니다. –