【发布时间】:2020-06-22 11:04:27
【问题描述】:
我必须与现有数据库集成,并使用 EF 实现数据加载(我们只读取,但从未使用此应用程序写入数据)。最后缺少的步骤是加载本地化数据。
UDC (UserDefinedCode) 表包含所有本地化值。每个其他实体都可以有 0-n 个代码,这些代码必须从 UDC 表中解析出来。
这是 Sequenz 上一个字段的 SQL 示例:
SELECT sequenz.Zulassungsstatus,
udc.Beschreibung1
FROM [dbo].[Sequenz] sequenz
LEFT JOIN [dbo].[UserDefinedCode] udc ON udc.UserDefinedCode = 'MA_STATUS' AND udc.CodeValue = sequenz.Zulassungsstatus
相关实体:
public class SequenzEntity : TemporalEntity
{
public int Zulassungsnummer { get; set; }
public int Sequenznummer { get; set; }
public string Zulassungsstatus { get; set; }
public DateTime WiderrufVerzichtDatum { get; set; }
public string SequenzName { get; set; }
public string Zulassungsart { get; set; }
public int BasisSequenzNummer { get; set; }
public string Anwendungsgebiet { get; set; }
public int ChargenblockadeAktiv { get; set; }
public ApplikationsartEntity Applikationsart { get; set; }
public PraeparatEntity Praeparat { get; set; }
public IEnumerable<PackungEntity> Packungen { get; set; }
public IEnumerable<DeklarationEntity> Deklarationen { get; set; }
}
public class UserDefinedCodeEntity : TemporalEntity
{
public string SystemCode { get; set; }
public string UserDefinedCode { get; set; }
public string CodeValue { get; set; }
public string SprachCode { get; set; }
public string Beschreibung1 { get; set; }
public string Beschreibung2 { get; set; }
public string BeschreibungLang { get; set; }
}
EF模型正在DbContext.OnModelCreating中配置:
protected override void OnModelCreating(ModelBuilder builder)
{
// Configure our entities
builder.Entity<SequenzEntity>(ConfigureSequenzEntity);
builder.Entity<UserDefinedCodeEntity>(ConfigureUserDefinedCodeEntity);
[...]
base.OnModelCreating(builder);
}
private static void ConfigureSequenzEntity(EntityTypeBuilder<SequenzEntity> builder)
{
ConfigureTemporalEntity(builder);
builder.ToTable("Sequenz");
builder.HasKey(sequenzEntity => new {sequenzEntity.Zulassungsnummer, sequenzEntity.Sequenznummer});
builder.HasMany(sequenzEntity => sequenzEntity.Deklarationen)
.WithOne(deklarationEntity => deklarationEntity.Sequenz);
builder.HasMany(sequenzEntity => sequenzEntity.Packungen)
.WithOne(packungEntity => packungEntity.Sequenz)
.HasForeignKey(packungEntity => new {packungEntity.Zulassungsnummer, packungEntity.Sequenznummer});
}
private static void ConfigureUserDefinedCodeEntity(EntityTypeBuilder<UserDefinedCodeEntity> builder)
{
ConfigureTemporalEntity(builder);
builder.ToTable("UserDefinedCode");
builder.HasKey(userDefinedCodeEntity => new
{
userDefinedCodeEntity.SystemCode,
userDefinedCodeEntity.UserDefinedCode,
userDefinedCodeEntity.CodeValue,
userDefinedCodeEntity.SprachCode
});
}
private static void ConfigureTemporalEntity<TEntity>(EntityTypeBuilder<TEntity> builder)
where TEntity : TemporalEntity
{
ConfigureBaseEntity(builder);
builder.HasTemporalTable();
builder.Property(baseEntity => baseEntity.VersionValidityStart)
.HasColumnName("SysStartTime");
builder.Property(baseEntity => baseEntity.VersionValidityEnd)
.HasColumnName("SysEndTime");
}
private static void ConfigureBaseEntity<TEntity>(EntityTypeBuilder<TEntity> builder)
where TEntity : BaseEntity
{
builder.HasKey(baseEntity => baseEntity.Id);
}
我很难弄清楚如何设置模型和配置 EF 以加载导航属性。如果我添加
- 序列实体:
public IEnumerable<UserDefinedCodeEntity> ZulassungsstatusCodes { get; set; } - 用户定义代码实体:
public IEnumerable<SequenzEntity> Sequenzen{ get; set; }
我显然得到了一个无法在 EF 中配置的多对多关系。
是否可以按照我的意愿使用 EF 加入 UDC 表?
【问题讨论】:
标签: c# entity-framework-core ef-core-3.1 navigation-properties