2013-02-27 2 views
0

Проверки на следующие сценариях Db:EF Карта One Для многого сложного PK - Нет PK недвижимость по уходу за детьми класса

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

Невозможно. Вы всегда должны раскрывать полный ключ как свойства в своей модели. Отображение может быть достигнуто тогда:

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

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

Я в конечном итоге добавляю LogEntryId в класс LogEntryData и отлично работал. Так спасибо за ответ. – rzumbado

Смежные вопросы