Сначала создайте код сопоставления

Ладно, это сводит меня с ума.
Я попытался сначала построить несколько таблиц с помощью кода, но не смог заставить его сделать то, что я просил.
Таким образом, я использовал SQL Management studio для создания таблиц, которые я буду публиковать сейчас:

CREATE TABLE [dbo].[Products](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nchar](10) NULL,
 CONSTRAINT [PK_Products] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

и для детали продукта я имею

CREATE TABLE [dbo].[ProductDetail](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Title] [nchar](10) NULL,
    [Summary] [nchar](10) NULL,
    [ProductId] [int] NOT NULL,
 CONSTRAINT [PK_ProductDetail] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[ProductDetail]  WITH CHECK ADD  CONSTRAINT [FK_ProductDetail_Products] FOREIGN KEY([ProductId])
REFERENCES [dbo].[Products] ([Id])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[ProductDetail] CHECK CONSTRAINT [FK_ProductDetail_Products]
GO

Как вы можете видеть, если я удаляю продукт, то ProductDetails также будут удалены.
Но если я удаляю свои ProductDetails, он не каскадируется.

По какой-то причине мне очень трудно воспроизвести это в коде First EF.
Кто-нибудь может мне помочь?

1 ответ

  1. Я всегда генерирую свой код первых классов домена и сопоставлений с помощью Entity Framework Power Tools, и это работает отлично. Я использовал этот инструмент для создания первых классов кода на основе ваших двух таблиц, опубликованных выше. Вот они:

    public partial class Product
    {
        public Product()
        {
            this.ProductDetails = new List<ProductDetail>();
        }
    
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<ProductDetail> ProductDetails { get; set; }
    }
    
    public class ProductMap : EntityTypeConfiguration<Product>
    {
        public ProductMap()
        {
            // Primary Key
            this.HasKey(t => t.Id);
    
            // Properties
            this.Property(t => t.Name)
                .IsFixedLength()
                .HasMaxLength(10);
    
            // Table & Column Mappings
            this.ToTable("Products");
            this.Property(t => t.Id).HasColumnName("Id");
            this.Property(t => t.Name).HasColumnName("Name");
        }
    }
    
    public partial class ProductDetail
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Summary { get; set; }
        public int ProductId { get; set; }
        public virtual Product Product { get; set; }
    }
    
    public class ProductDetailMap : EntityTypeConfiguration<ProductDetail>
    {
        public ProductDetailMap()
        {
            // Primary Key
            this.HasKey(t => t.Id);
    
            // Properties
            this.Property(t => t.Title)
                .IsFixedLength()
                .HasMaxLength(10);
    
            this.Property(t => t.Summary)
                .IsFixedLength()
                .HasMaxLength(10);
    
            // Table & Column Mappings
            this.ToTable("ProductDetail");
            this.Property(t => t.Id).HasColumnName("Id");
            this.Property(t => t.Title).HasColumnName("Title");
            this.Property(t => t.Summary).HasColumnName("Summary");
            this.Property(t => t.ProductId).HasColumnName("ProductId");
    
            // Relationships
            this.HasRequired(t => t.Product)
                .WithMany(t => t.ProductDetails)
                .HasForeignKey(d => d.ProductId);
    
        }
    }