【发布时间】:2013-07-24 20:38:22
【问题描述】:
更新:在 GitHub 上创建了 sample project。
在我现有的数据库中,我有一个没有键的通用审计表,但我想先用 EF 代码插入到这个审计表中。
现有报告根据 AffectedId 和 EntityId 提取审计,其中 EntityId 在很多地方被硬编码。
我对数据库进行了逆向工程,但这些表之间没有明确的关系......所以这里是基本 POCO 对象(我也无法建立关系,它是一个现有系统)
public class Audit
{
public int Id { get; set; }
public int EntityId { get; set; }
public string AffectedId { get; set; }
public string NewValue { get; set; }
}
public class Action1
{
public int Id { get; set; }
public string Desc { get; set; }
}
public class Action2
{
public int Id { get; set; }
public string Desc { get; set; }
}
我想我希望 POCO 对象看起来像这样
public class Audit
{
public int Id { get; set; }
public int EntityId { get; set; }
public string AffectedId { get; set; }
public string NewValue { get; set; }
public virtual Action1 Action1 { get; set; } // but I don't want this to change audit table
public virtual Action2 Action2 { get; set; } // but I don't want this to change audit table
}
public class Action1
{
public Action1() {this.Audits = new List<Audit>();}
public int Id { get; set; }
public string Desc { get; set; }
public virtual ICollection<Audit> Audits { get; set; }
}
public class Action2
{
public Action2() {this.Audits = new List<Audit>();}
public int Id { get; set; }
public string Desc { get; set; }
public virtual ICollection<Audit> Audits { get; set; }
}
但我似乎无法获得流畅的映射以允许我在审核中插入已填充 AffectedId 的操作(1 或 2)。这就是我在映射对象上的想法,但似乎无法让硬编码的 EntityId 键正常工作。
public class AuditMap : EntityTypeConfiguration<Audit>
{
public AuditMap()
{
// Primary Key
this.HasKey(t => t.Id);
this.HasOptional(t => t.Action1)
.WithMany(t => t.Audits)
.HasForeignKey(t => new {EntityId = 3, AffectedId = t.Id});
this.HasOptional(t => t.Action2)
.WithMany(t => t.Audits)
.HasForeignKey(t => new {EntityId = 5, AffectedId = t.Id});
}
}
public class Action1 : EntityTypeConfiguration<Action1>
{
public Action1Map()
{
// Primary Key
this.HasKey(t => t.Id);
}
}
public class Action2 : EntityTypeConfiguration<Action2>
{
public Action2Map()
{
// Primary Key
this.HasKey(t => t.Id);
}
}
任何关于如何更改 C# 而不是 SQL 的建议将不胜感激。
【问题讨论】:
-
EntityId 总是 3 和 5 吗?
-
是的,它们是任意标识符,不会更改,但对于操作是唯一的。可以有更多具有自己不变的任意唯一标识符的操作。
-
好的,我根据你的 Github 代码修改了答案
标签: c# entity-framework entity-framework-5