将复杂对象展平到数据库中的实体

时间:2018-10-08 12:13:41

标签: c# entity-framework-core

假设我有以下对象:

实体:

public class MyEntity : NamedEntity
{
}

public abstract class NamedEntity : VersionedEntity
{
    public LocalizedText Name { get; set; }
}

复杂对象(LocalizedText):

public class LocalizedText : ILocalized<string>
{
    protected LocalizedText()
    {
    }

    public LocalizedText(string en, string de = null, string fr = null)
    {
        En = en;
        De = de;
        Fr = fr;
    }

    public string En { get; set; }
    public string De { get; set; }
    public string Fr { get; set; }
}

有了这个,我得到以下异常:

System.InvalidOperationException: 'The entity type 'LocalizedText' requires a primary key to be defined.'

我不想使用LocalizedText来创建实体,但希望将其存储在数据库中MyEntity表的列中,例如Name_EN,Name_DE和Name_FR。

我该如何实现?

1 个答案:

答案 0 :(得分:0)

我在这里https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-entity-framework-core-2-0/#owned-entities-and-table-splitting找到了解决方法

对于上面的代码,我已将DbContext实现修改为:

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<MyEntity>()
               .OwnsOne(r => r.Name);
    }

这将导致以下CREATE([...]中遮盖了不相关的部分):

CREATE TABLE [dbo].[MyEntity](
    [...]
    [Name_En] [nvarchar](max) NULL,
    [Name_De] [nvarchar](max) NULL,
    [Name_Fr] [nvarchar](max) NULL,