我想问一下在EntityFramework Core-v 2.1中构建模型的问题。 首先要做的事情-我要实现的目标如下:
// I want this entity to be stored in database, with EntityReferences as owned records,
// stored within the same table.
// There will be more properties of type EntityReference.
public partial class CdiEmailEvent
{
public override Guid Id { get; set; }
public EntityReference CdiAccountId
public EntityReference CdiAutomationId
}
// EntityReference is a pointer to record, containing Id of target record and it's type.
// So Id does not point to CdiEmailEntity record, but for example an Account or Contact.
// I want this to be an owned record within CdiEmailEvent.
public sealed class EntityReference : IExtensibleDataObject
{
public Guid Id { get; set; }
public string LogicalName { get; set; }
public string Name { get; set; }
public string RowVersion { get; set; }
}
因此实际数据可能如下所示:
new CdiEmailEvent {
Id = "18640407-1A44-430A-8267-96BD23CC9EE8",
CdiAccountId = new CdiAccountId {
Id = "FBBB4932-C74C-47CE-8D1B-909C5975D945",
Name = "Account",
LogicalName = "cdi_account"
},
CdiAutomationId = new CdiAccountId {
Id = "5496BC1C-C5FD-4AFB-B6D9-913DD5549C13",
Name = "Automation",
LogicalName = "cdi_automation"
},
...
}
我希望数据库表看起来像这样:
Id | CdiAccountId | CdiAccountName | CdiAccountLogicalName | CdiAutomationId | CdiAutomationName | CdiAutomationLogicalName
"18640407-1A44-430A-8267-96BD23CC9EE8" | "FBBB4932-C74C-47CE-8D1B-909C5975D945" | "Account" | "cdi_account" | "5496BC1C-C5FD-4AFB-B6D9-913DD5549C13" | Automation | "cdi_automation"
我当前的模型配置是:
modelBuilder
.Entity<CdiEmailEvent>(entity =>
{
entity.HasKey(e => e.CdiEmailEventId);
entity.OwnsOne(rel => rel.CdiAccountId);
entity.OwnsOne(rel => rel.CdiAutomationId);
...
entity.ToTable("CdiEmailEvents", this._databaseConfig.DatabaseSchema);
});
我遇到的问题是:
System.InvalidOperationException: 'The entity of type 'CdiEmailEvent' is sharing
the table 'replication.CdiEmailEvents' with entities of type
'CdiEmailEvent.CdiAutomationId#EntityReference', but there is no entity of this
type with the same key value '{CdiEmailEventId: 8a99d6ab-cd82-4eb8-b548-50d903d6f26c}'
that has been marked as 'Added'.'
我猜想EF Core正在尝试使用CdiAutomationId作为对CdiEmailEvent的引用。有谁知道我该如何改变这种行为,并强制EF Core将CdiAutomationId简单地视为没有任何键的对象?我浏览了EF Core的文档,但这在这方面不是很描述。