EF 4.0 Код только ассоциация от абстрактного к производному - PullRequest
0 голосов
/ 16 февраля 2010

Используя только код EF 4.0, я хочу установить связь между абстрактным и обычным классом.

У меня есть классы "Item", "ContentBase" и "Test".

ContentBase является абстрактным, а «Test» является его производным.

ContentBase имеет свойство «Item», которое ссылается на экземпляр «Item».

Так что Test.Item или любой класс, производный от ContentBase, имеет свойство навигации Item.

В моей БД каждая запись для Test имеет соответствующую запись для Item.


public class Item
{
    public int Id { get; set;}
}

public abstract class ContentBase
{
    public int ContentId { get; set;}
    public int Id { get; set;}

    public Item Item { get; set;}
}

public class Test : ContentBase
{
    public string Name { get; set;}
}

теперь немного кода инициализации

public void SomeInitFunction()
{

    var itemConfig = new EntityConfiguration<Item>();
    itemConfig.HasKey(p => p.Id);
    itemConfig.Property(p => p.Id).IsIdentity();
    this.ContextBuilder.Configurations.Add(itemConfig);

    var testConfig = new EntityConfiguration<Test>();
    testConfig.HasKey(p => p.ContentId);
    testConfig.Property(p => p.ContentId).IsIdentity();

    // the problem 
    testConfig.Relationship(p => p.Item).HasConstraint((p, q) => p.Id == q.Id);

    this.ContextBuilder.Configurations.Add(testConfig);  
}

Это дает ошибку: Ключ зарегистрирован для производного типа «Тест». Ключи должны быть зарегистрированы для корневого типа «ContentBase».

В любом случае, я пытаюсь получить ошибку. Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 23 июля 2010

Заключение на данный момент: невозможно.

0 голосов
/ 06 ноября 2010

Попробуйте в сущности типа суперпредставить ваши отношения:

В ContentBase: публичный виртуальный предмет Item {get; установить;}

В тесте: публичный новый предмет Item {get; установить;}

Это скомпилировано в моем тестовом проекте, но я не тестировал его дальше. Просто пока, Eb5 или финальный комео

0 голосов
/ 16 мая 2010

Свойство навигации Item определяется на уровне базового типа, поэтому модель знает о базовом типе - вы можете добавить свойство в тестовый класс, который передает свойство Item и отобразите это в вашем отношении:

public class Test : ContentBase
{
    public string Name { get; set;}
    public string TestItem { get {return Item;} ...

}

testConfig.Relationship(p => p.TestItem )
...