Сначала код EF core, потеря внешнего ключа после его обнуления - PullRequest
0 голосов
/ 08 ноября 2018

У меня было это:

public class Customer
{
    public int Id {get; set;}
    //some more properties
}

public class Payment
{
    public int Id {get; set;}
    public int CustomerId {get; set;} //foreign key
    public Customer Customer {get; set;}
}

Что приводит к ограничению внешнего ключа в базе данных. Затем я сделал CustomerId обнуляемым:

public class Payment
{
    public int Id {get; set;}
    public int? CustomerId {get; set;} //foreign key
    public Customer Customer {get; set;}
}

Если я генерирую скрипт миграции, я получаю что-то вроде этого:

IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'MyMigration')
BEGIN

DECLARE @var2 sysname;

    SELECT @var2 = [d].[name]
      FROM [sys].[default_constraints] [d]
INNER JOIN [sys].[columns] [c] ON [d].[parent_column_id] = [c].[column_id] 
       AND [d].[parent_object_id] = [c].[object_id]
     WHERE ([d].[parent_object_id] = OBJECT_ID(N'[Payments]') AND [c].[name] = N'CustomerId');

IF @var2 IS NOT NULL EXEC(N'ALTER TABLE [Payments] 
    DROP CONSTRAINT [' + @var2 + '];');

ALTER TABLE [Payments] ALTER COLUMN [CustomerId] int NULL;
END;

GO

Так что теперь столбец Payments.CustomerId может иметь значение NULL, но ограничение внешнего ключа удалено. Как я могу вернуть ограничение внешнего ключа?

редактировать: еще одна вещь. Между изменениями моего кода я также добавил это в защищенное переопределение void OnModelCreating (ModelBuilder modelBuilder):

new PaymentMap(modelBuilder.Entity<Payment>());

Ответы [ 4 ]

0 голосов
/ 12 ноября 2018

Я удалил свою локальную базу данных и заново создал ее с помощью «update-database». Это решило мою проблему. Спасибо всем за потраченное время и усилия!

0 голосов
/ 08 ноября 2018

Чтобы заставить его работать, вы должны добавить public virtual ICollection<Tenant> Payments { get; set;} в Customer class

Blockquote

public class Customer
{
    public int Id { get; set; }
    public virtual ICollection<Payment> Payments { get; set; }
}

public class Payment
{
    public int PaymentId{ get; set; }
    public int? CustomerId { get; set; }
    public Customer Customer { get; set; }
}
0 голосов
/ 08 ноября 2018

Поскольку EF Core требует ручного создания соединений между таблицами, вы пытались записать их в свой класс DataContext?

Добавьте List<Payment> Payments в свой класс Customer и в свой класс DataContext в методе переопределения OnModelCreate add:

builder
     .Entity<Payment>()
     .HasOne(p => p.Customer)
     .WithMany(c => c.Payments)
     .HasForeignKey(p => p.CustomerId);
0 голосов
/ 08 ноября 2018

Вы должны аннотировать это явно System.ComponentModel.DataAnnotations.Schema.ForeignKeyAttribute:

public class Payment
{
    public int Id {get; set;}

    public int? CustomerId {get; set;} //foreign key

    [ForeignKey("CustomerId")]
    public Customer Customer {get; set;}
}
...