ShadowProperties достигаются foreach перед созданием - PullRequest
0 голосов
/ 19 октября 2018

Я новичок в Entity Framework и учусь на курсах Pluralsight от Джули Лерман.Я смотрю второй курс " Entity Framework Core 2: Mappings ", но я использую EF Core 2.1.

Редактировать: поэтому я решил все прокомментировать и повторить курс итеперь он работает, НО сгенерированная миграция генерирует 2 столбца, которых там быть не должно:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.AddColumn<DateTime>(
                name: "BetterName_Created",
                table: "Samurais",
                nullable: false,
                defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));

    migrationBuilder.AddColumn<string>(
                name: "GivenName",
                table: "Samurais",
                nullable: true);

    migrationBuilder.AddColumn<DateTime>(
                name: "BetterName_LastModified",
                table: "Samurais",
                nullable: false,
                defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));

    migrationBuilder.AddColumn<string>(
                name: "SurName",
                table: "Samurais",
                nullable: true);
}

SamuraiContext.cs

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<SamuraiBattle>().HasKey(s => new { s.SamuraiId, s.BattleId });

    modelBuilder.Entity<Battle>().Property(b => b.StartDate).HasColumnType("Date");
    modelBuilder.Entity<Battle>().Property(b => b.EndDate).HasColumnType("Date");

    foreach (var entityType in modelBuilder.Model.GetEntityTypes())
    {
        modelBuilder.Entity(entityType.Name).Property<DateTime>("Created");  
        modelBuilder.Entity(entityType.Name).Property<DateTime>("LastModified");
    }

    modelBuilder.Entity<Samurai>().OwnsOne(s => s.BetterName).Property(b => b.GivenName).HasColumnName("GivenName");
    modelBuilder.Entity<Samurai>().OwnsOne(s => s.BetterName).Property(b => b.SurName).HasColumnName("SurName");
}

контекст foreach был создан еще до того, как я добавилИмя / Фамилия, пока все не работает как задумано.Но после добавления последних 2 строк для имени столбца он добавляет BetterName_Created и BetterName_LastModified почему?(по курсу не должно)

PersonFullName.cs

public class PersonFullName
{
    public string SurName { get; set; }
    public string GivenName { get; set; }
    public string FullName => $"{GivenName} {SurName}";
    public string FullNameReverse => $"{SurName}, {GivenName}";

    public PersonFullName(string givenName, string surName)
    {
        SurName = surName;
        GivenName = givenName;
    }
}

Samurai.cs

public class Samurai
{
    public int Id { get; set; }
    public string Name { get; set; }
    public PersonFullName BetterName { get; set; }
    public List<Quote> Quotes { get; set; }
    public List<SamuraiBattle> SamuraiBattles { get; set; }
    public SecretIdentity SecretIdentity { get; set; }

    public Samurai()
    {
        Quotes = new List<Quote>();
        SamuraiBattles = new List<SamuraiBattle>();
    }
}

С уважением, Адриано.

1 Ответ

0 голосов
/ 19 октября 2018

Это потому, что цикл foreach также определяет свойства теней для принадлежащих им объектов.Помните, что согласно терминологии EF Core объекты все еще являются сущностями, поэтому GetEntityTypes() включает их в набор результатов.

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

foreach (var entityType in modelBuilder.Model.GetEntityTypes().Where(t => !t.IsOwned())
{
    // ...
}

Кроме того, такие циклы должны быть после обнаружения всех типов сущностей и принадлежащих им сущностей.Если PersonFullName не помечен атрибутом [Owned], переместите foreach после вызовов OwnsOne (или лучше в конце OnModelCreating).

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