Как смоделировать отношения в EF Core при использовании пользовательских таблиц и имен полей - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь смоделировать отношения между двумя таблицами в существующей базе данных MsSQL с использованием EF Core, но в базе данных есть таблицы с использованием пользовательских имен таблиц и имен столбцов.

EF Core не удается настроить отношения, хотя я определяю отношения, используя либо атрибуты, либо FluentAPI.

Я думаю, что проблема в том, что у меня есть нестандартные имена для таблиц и столбцов, а EF не может правильно настроить отношения.

Вот SQL:

CREATE TABLE paid_authors
(
    paid_author_id varchar(50) NOT NULL,
    [name] varchar(50) NOT NULL
)

CREATE TABLE hardback_books
(
    hardback_book_id uniqueidentifier NOT NULL,
    paid_author_id varchar(50) NOT NULL,
    title varchar(50) NOT NULL
)

INSERT INTO paid_authors VALUES ('duck' ,'Scrooge McDuck')
INSERT INTO hardback_books VALUES (NEWID(), 'duck', 'Duck Tales')

Вот C # моделирование:

[Table("paid_authors")]
public class PaidAuthor
{        
    [Key]
    [Column("paid_author_id")]
    public string PaidAuthorId { get; set; }

    [Column("name")]
    public string Name { get; set; }

    public virtual List<HardbackBook> HardbackBooks { get; set; }
}

[Table("hardback_books")]
public class HardbackBook
{
    [Key]
    [Column("hardback_book_id")]
    public Guid HardbackBookId { get; set; }

    [Column("title")]
    public string Title { get; set; }

    [ForeignKey("HardbackBooks")] // This could be wrong!
    [Column("paid_author_id")]
    public string PaidAuthorId {get; set;}
}

Мой код:

foreach(var author in context.PaidAuthors.Take(10))
{
    // This next line makes it work, but it shouldn’t be needed!
    // author.HardbackBooks = context.HardbackBooks.Where(x => x.PaidAuthorId == author.PaidAuthorId).ToList();

    Console.WriteLine(author.PaidAuthorId + " - " + author.Name);
    Console.WriteLine(author.HardbackBooks.Count);
}

Когда язапустите код, который я получаю System.NullReferenceException и author.HardbackBooks равен нулю.

Я пробовал FluentAPI, указав ForeignKey для родительского класса ... Но должно быть что-то очевидное, что я пропускаю!Я рад переключиться на FluentAPI, если он может работать там.

Излишне говорить, что я не могу изменить структуру БД ...: - (

1 Ответ

0 голосов
/ 11 декабря 2018

Нельзя оставлять коллекционное свойство навигации пустым, и в книге должно быть обратное свойство навигации.Что-то вроде:

[Table("paid_authors")]
public class PaidAuthor
{
    [Key]
    [Column("paid_author_id")]
    public string PaidAuthorId { get; set; }

    [Column("name")]
    public string Name { get; set; }

    public virtual List<HardbackBook> HardbackBooks { get; } = new HashSet<HardbackBook>();
}

[Table("hardback_books")]
public class HardbackBook
{
    [Key]
    [Column("hardback_book_id")]
    public Guid HardbackBookId { get; set; }

    [Column("title")]
    public string Title { get; set; }

    public PaidAuthor PaidAuthor { get; set; }

    [ForeignKey("PaidAuthor")] 
    [Column("paid_author_id")]
    public string PaidAuthorId { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...