Создать свойство навигации без внешнего ключа - PullRequest
0 голосов
/ 13 марта 2019

У меня есть два класса, например, так:

[Table("GameLevels", Schema = "ref")]
public class GameLevel
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }
    public double PointsMin { get; set; }
    public double PointsMax { get; set; }
}

[Table("GameProfiles", Schema = "usr")]
public class UserGameProfile 
{
    [Key]
    [ForeignKey("ApplicationUser")]
    public string Id { get; set; }
    public int GamesPlayed { get; set; }
    public double Points { get; set; }
    public int WinCount { get; set; }
    public int LossCount { get; set; }
    public int DrawCount { get; set; }
    public int ForfeitCount { get; set; }
    public int GameLevelId { get; set; }

    public virtual GameLevel Level { get; set; }

    public virtual ApplicationUser ApplicationUser { get; set; }
}

Платформа сущностей строит это так, что у UserGameProfile есть внешний ключ, указывающий на GameLevel.Я думаю, это из-за свойства GameLevelId.

Можно ли как-нибудь получить это, чтобы сгенерировать таблицы и свойство навигации без внешнего ключа?

Я попытался:

modelBuilder.Entity<UserGameProfile>().HasOptional<GameLevel>(x => x.Level).WithMany();

Но тогда не удается построить базу данных,С этой ошибкой:

Обнаружена одна или несколько ошибок проверки при создании модели:

Project.Domain.Data.UserGameProfile_Level:: множественность конфликтует с ссылочным ограничением в роли "UserGameProfile_Level_Target"в отношениях 'UserGameProfile_Level'.Поскольку все свойства в зависимой роли не могут быть равны нулю, кратность основной роли должна быть равна 1.

В основном я хочу, чтобы от нуля или единицы до нуля илимного отношений.

Как сохранить уровни независимыми, но при этом иметь возможность добавить уровень в профиль?

1 Ответ

0 голосов
/ 13 марта 2019

Вы не можете полностью удалить внешний ключ, иначе как вы ожидаете, что две сущности (то есть таблицы) будут связаны? Вместо этого вы можете использовать обнуляемую FK, которая фактически сделает отношения ноль или один к многим.

В своем классе GameLevel добавьте свойство навигации как коллекцию UserGameProfile:

public class GameLevel
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }
    public double PointsMin { get; set; }
    public double PointsMax { get; set; }

    public virtual ICollection<UserGameProfile> UserGameProfiles { get; set; }
}

Затем в классе UserGameProfile сделайте свойство GameLevelId обнуляемым:

public class UserGameProfile 
{
    // ...
    // ...

    public int? GameLevelId { get; set; }

    [ForeignKey("GameLevelId")]
    public virtual GameLevel GameLevel { get; set; }
}

Это должно работать без использования Fluent API.

...