Entity Framework 4.1 Вопрос внешнего ключа - PullRequest
1 голос
/ 25 сентября 2011

Я берусь за разработку базы данных электронной коммерции в EF 4.1 Code First.

Я попал в ситуацию, когда я думаю, что я оправдан, но не уверен ..

Рассмотрим:

class Download
{
    int ID
    string Mime
    string Filename
    string Extension
}

class DownloadBinary
{
    int ID
    int DownloadID
    Download Download
    byte[] Binary
}

class DownloadURL
{
    int ID
    int DownloadID
    Download Download
    string URL
}

Теперь я поместил Foreign Keys для скачивания в два других класса, так как я хочу удалить нули в основном. Также у этого есть побочный продукт разрешения нескольких классов DownloadBinary и DownloadURL для класса Download, который кажется нормальным. Но это кажется неправильным с точки зрения EF, поскольку класс Download не инкапсулирует классы DownloadBinary и DownloadURL.

Я знаю, что могу найти в DbContext и удалить классы DownloadBinary и DownloadURL для заданного идентификатора класса загрузки, чтобы я мог получить данные в порядке.

Если бы я держал DownloadBinary ID и DownloadURL ID в классе Download, я мог бы получить нулевые значения, что является моей целью сделать это таким образом.

Я действительно ожидаю, что в моих формах ввода данных будут применены отношения «один к нулю» или «один» для классов «Download» и «DownloadBinary» или «DownloadURL».

Я не вижу здесь большой проблемы, но что думают более опытные люди ??

1 Ответ

1 голос
/ 25 сентября 2011

Удалите DownloadID из DownloadBinary и DownloadUrl и отобразите ID этих классов в качестве внешнего ключа в ID из Download.EF поддерживает взаимно-однозначное отношение только по первичным ключам, поскольку не поддерживает уникальные ключи.

modelBuilder.Entity<Download>()
            .HasOptional(d => d.DownloadBinary)
            .WithRequired(db => db.Download);


modelBuilder.Entity<Download>()
            .HasOptional(d => d.DownloadUrl)
            .WithRequired(du => du.Download);

Оба DownloadBinary и DownloadUrl не должны использовать автоматически сгенерированный идентификатор в базе данных, поскольку их идентификатор определенDownload: modelBuilder.Entity () .Property (db => db.ID) .HasDatabaseGeneratedOption (DatabaseGeneratedOption.None);

modelBuilder.Entity<DownoladUrl>()
            .Property(du => du.ID)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);   
...