Как отобразить многоинтерфейсную реализацию с использованием NHibernate - PullRequest
1 голос
/ 03 апреля 2011

Я много искал, как сопоставить множественное наследование или имплантацию нескольких интерфейсов, используя EntityFramework или NHibernate, но я не нашел ничего полезного.

Я просто хочу отобразить эту структуру, используя NHibernate:

    public interface IA
    {
        string A { get; set; }
    }

    public interface IB
    {
        string B { get; set; }
    }

    public class C : IA, IB
    {
        string A { get; set; }
        string B { get; set; }            
    }

Насколько я знаю, отображение этой структуры в реляционной базе данных означает просто иметь внешние ключи, связанные с первичными ключами интерфейсов, поэтому интерфейсы должны иметь такие ключи:

public interface IA
{
    Guid AId { get; set; }
    string A { get; set; }
}

public interface IB
{
    Guid BId { get; set; }
    string B { get; set; }
}

public class C : IA, IB
{
   public virtual Guid AId { get; set; }
   public virtual Guid BId { get; set; }
   public virtual string A { get; set; }
   public virtual string B { get; set; }
}

Но какчтобы отобразить эту структуру с помощью NHibernate или EntityFramework, и я не знаю, почему многократное сопоставление интерфейсов не упоминается в их документации!

Ответы [ 3 ]

1 голос
/ 03 апреля 2011

В NHibernate вы просто отобразите C , как если бы интерфейсы не существовали .

Вы по-прежнему сможете запрашивать интерфейсы благодаря неявному полиморфизму.

0 голосов
/ 13 апреля 2011

Как я выяснил, невозможно иметь множественное наследование в реляционной базе данных из-за концепции и того, что Диего сказал правдиво в сценарии «не-интерфейсы получают постоянство».

0 голосов
/ 03 апреля 2011

Вы отобразите его как любой другой класс , потому что это не отображение наследования.Более того, ваш код не может быть скомпилирован, потому что вы должны реализовать все свойства в классе C, чтобы вы получили:

public interface IA
{
    Guid AId { get; set; }
    string A { get; set; }
}

public interface IB
{
    Guid BId { get; set; }
    string A { get; set; }
}

public class C : IA, IB
{
    public virtual Guid AId { get; set; }
    public virtual Guid BId { get; set; }
    public virtual string A { get; set; }
}

Теперь ваш код может быть скомпилирован, и у вас есть класс, как и любой другой.Вы отобразите AId и BId в качестве составного ключа (в зависимости от используемого ORM), и все готово.Это не наследование, потому что у вас есть только один объект и нет базового объекта.По крайней мере, так работает с Entity Framework.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...