Как оставить потерянные данные? - PullRequest
0 голосов
/ 14 мая 2018

Использование Visual Studio 2017, C #, Entity Framework .Net 6.2.0

У меня есть установка, в которой таблица (LOG) имеет внешний ключ к другой таблице (BAR). Я хочу удалить запись из BAR, оставив запись и внешний ключ без изменений в LOG.

public class LOG
{
    [Key]
    public int id { get; set; }
    public string statusLog { get; set; }
    public virtual BAR bar { get; set; }
}

public class BAR
{
    [Key]
    public int id { get; set; }
    public string data { get; set; }
}

Затем я пытаюсь удалить запись.

BAR bar1 = DBContext.BARs.Where(b => b.id == enteredID).First();
DBContext.BARs.Remove(bar1);
DB.Context.SaveChanges();

и получите это исключение

Оператор DELETE конфликтует с ограничением REFERENCE "FK_dbo.LOG_dbo.BARs_BAR_id". Конфликт произошел в базе данных \ "******* \", таблица "dbo.LOG", столбец "BAR_id".

Заявление прекращено

Как я могу удалить запись из таблицы BAR, оставляя записи в таблице LOG? Я хочу, чтобы данные отображали то, что произошло в моей таблице журналов, даже когда записи добавляются и удаляются из моей системы.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Вы должны добавить идентификатор в ваш класс журнала:

public class LOG
{
[Key]
public int id { get; set; }
public string statusLog { get; set; }
public int? BarId{ get; set; }

[ForeignKey("BarId")]
public virtual BAR bar { get; set; }
}

и изменить OnModelCreating

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Log>()
            .HasOptional(p => p.bar)
            .WithMany()
            .HasForeignKey(p => p.barID);
 }

Таким образом, это означает, что отношение является необязательным, и когда вы удаляете Bar, оно обновляет журнал.barid равен нулю и удалите соответствующий Bar.

Но опять же прежде всего вы должны загрузить их все.

0 голосов
/ 14 мая 2018

С чисто Entity Framework точки зрения, используйте Nullable Внешний ключ

Пример

public class LOG
{
    [Key]
    public int id { get; set; }
    public string statusLog { get; set; }
    public int? BarId{ get; set; }
    public virtual BAR bar { get; set; }
}

Что нужно учитывать:

Хотя SQL Server поддерживает это, EF не может установить каскадное правило для аннулирования FK при удалении связанного объекта.

При удалении Bar вам потребуется загрузить Logs в память, чтобы обнулить их ...

Посмотрите любое количество связанных вопросов, чтобы решить эту проблему

Как обновить FK до нуля при удалении необязательной связанной сущности

...