EF地图一对多复合PK - 儿童类没有PK属性

时间:2013-02-27 17:29:10

标签: entity-framework one-to-many fluent-interface

检查以下Db脚本:

CREATE TABLE tlogdata
(
    logentryid INT NOT NULL, -- PK
    [key] NVARCHAR(25) NOT NULL, -- PK
    value NVARCHAR(MAX) NOT NULL
)

CREATE TABLE tlogentry
(
    logentryid INT IDENTITY(1,1) NOT NULL, -- PK
    [message] NVARCHAR(4000) NOT NULL
)

tlogentrydata具有复合PK => logentryid和关键。 logentryid引用tlogentry.logentryid列

现在我要做的就是像这样创建我的模型:

public class LogEntryData
{
    public string Key { get; set; }
    public string Value { get; set; }
}

public class LogEntry
{
    public int Id { get; set; }
    public string Message { get; set; }
    public List<LogEntryData> Data { get; set; } 
}

如您所见,LogEntryData不包含“LogEntryID”作为属性。所以我的问题是如何将这两个类映射(使用流畅的API)到我的表中? 我不知道是否甚至可以告诉EF LogEntryData有一个复合PK,而不将其中一个列暴露为公共属性(在这种情况下,LogEntryId不存在于LogEntryData类中但在tlogentrydata表上存在为logentryid列)

提前谢谢!

1 个答案:

答案 0 :(得分:1)

这是不可能的。您始终必须将完整键公开为模型中的属性。然后可以通过以下方式实现映射:

modelBuilder.Entity<LogEntryData>()
    .HasKey(led => new { led.LogEntryId, led.Key });

modelBuilder.Entity<LogEntry>()
    .HasMany(le => le.Data)
    .WithRequired()
    .HasForeignKey(led => led.LogEntryId);