Я создаю веб-сайт, используя сначала код entity-framework, где: пользователь может продавать много товаров: один-ко-многим. пользователь может покупать много продуктов, а продукты могут покупать многие пользователи: многие ко многим. я получаю сообщение об ошибке:
System.Data.SqlClient.SqlException: 'Introducing FOREIGN KEY constraint 'FK_dbo.UserProducts_dbo.Products_Product_ProductId' on table 'UserProducts' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Я действительно хочу каскадное удаление, чтобы удалить продукты, принадлежащие пользователю, который удалил свою учетную запись, или удалить записи из таблицы UserProduct, принадлежащие удаленному пользователю, или удаленный продукт. Что я делаю неправильно?
это класс User:
public class User
{
public int UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime BirthDate { get; set; }
public string Email { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public ICollection<Product> Products { get; set; }
[InverseProperty("Users")]
public ICollection<Product> Cart { get; set; }
public User()
{
Products = new List<Product>();
Cart = new List<Product>();
}
}
это класс продукта:
public class Product
{
[Key]
public int ProductId { get; set; }
public int OwnerId { get; set; }
public string Title { get; set; }
public string ShortDescription { get; set; }
public string LongDescription { get; set; }
public byte[] Picture1 { get; set; }
public byte[] Picture2 { get; set; }
public byte[] Picture3 { get; set; }
[ForeignKey("OwnerId")]
public User User { get; set; }
public ICollection<User> Users { get; set; }
public Product()
{
Users = new List<User>();
}
}
Вы добавили ссылку на внешний ключ в построитель модели?
@ j9070749 добавить к каким? коллекциям: ef frame-work делает это по соглашению, когда 2 объекта имеют коллекцию друг друга. а для «один ко многим» я использовал аннотацию внешнего ключа в модели продукта, которая должна выполнять эту работу.
Исключение ясно говорит вам, что происходит. Вы должны выбрать один внешний ключ, который может выполнять каскадное удаление. Используйте плавные сопоставления, чтобы отключить каскадное удаление на других FK.
Исключение, говорящее о недопустимом ограничении между таблицей UserProducts и Product. но почему. если ef-framework создает таблицу UserProducts, принципами являются продукт и пользователь. удаление записи из UserProducts не должно влиять ни на таблицу продуктов, ни на пользователя. но удаление продукта или записи пользователя должно. где недопустимый каскад?. @ GertArnold
@UNlessofficialchannel Когда вы удаляете User, UserProduct можно удалить с помощью (1) User -> UserProduct или (2) User -> Product -> UserProduct, следовательно, несколько каскадных путей.
@IvanStoev вот как я хочу, чтобы это работало. Что делать, чтобы эф его примет?
@UNlessofficialchannel Что ж, то, что вы хотите, не всегда то, что вы получаете может. К сожалению, это ограничение EF (происходит из-за ограничения базы данных SqlServer), поэтому вы ничего не можете сделать, чтобы позволить EF «принять это». Все, что вы можете сделать, это подписаться на комментарий Герта Арнольда.





Сначала мне нужно было написать класс для средней таблицы в отношении «многие-ко-многим», «пользователи-продукты»:
public class UserProduct
{
[Key, Column(Order = 0), ForeignKey("User")]
public int UserId { get; set; }
[Key, Column(Order = 1), ForeignKey("Product")]
public int ProductId { get; set; }
public User User { get; set; }
public Product Product { get; set; }
}
которые позволяют мне отключить каскад при удалении из этой таблицы в таблицу User (переопределив OnModelCreating в классе контекста):
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<UserProduct>().HasRequired(t =>
t.User).WithMany(t => t.Cart).WillCascadeOnDelete(false);
}
отключение каскада работает, потому что:
nvm я говорю, но название ошеломило меня на мгновение лол