在抽象类中定义关系-实体框架

时间:2019-08-29 09:32:13

标签: c# entity-framework

我尝试在抽象类中定义关系

public abstract class Entity
{
    public int Id { get; set; }

    public DateTime Added { get; set; }

    public DateTime Updated { get; set; }

    public int AdderId { get; set; }

    public int ModifierId { get; set; }

    public virtual Profile Modifier { get; set; }

    public virtual Profile Adder { get; set; }
}

public class Category : Entity
{
    public String Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Order : Entity
{
    public Status Status { get; set; }

    public int ProfileId { get; set; }

    public virtual Profile Profile { get; set; }
}

public class Product : Entity
{
    public string Name { get; set; }

    public int Count { get; set; }

    public double Cost { get; set; }

    public int CategoryId { get; set; }

    public virtual Category Category { get; set; }
}

public class ProductsInOrder : Entity
{
    public int Count { get; set; }

    public double Cost { get; set; }

    public bool Active { get; set; }

    public int ProductId { get; set; }

    public int OrderId { get; set; }

    public virtual Product Product { get; set; }

    public virtual Order Order { get; set; }
}

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

    public string UserName { get; set; }

    public virtual ICollection<Order> Orders { get; set; }

    public virtual ICollection<Order> AddedOrders { get; set; }

    public virtual ICollection<Order> ModifiedOrders { get; set; }

    public virtual ICollection<Category> AddedCategories { get; set; }

    public virtual ICollection<Category> ModifiedCategories { get; set; }

    public virtual ICollection<Product> AddedProducts { get; set; }

    public virtual ICollection<Product> ModifiedProducts { get; set; }

    public virtual ICollection<ProductsInOrder> AddedProductsInOrders { get; set; }

    public virtual ICollection<ProductsInOrder> ModifiedProductsInOrders { get; set; }
}

public enum Status
{
    New,
    ToPay,
    Payed,
    Deliving,
    Delived,
    Returned,
    Cancelled
}

public class ShopContext : DbContext
{
    public ShopContext()
        : base("DefaultConnection")
    {

    }

    public DbSet<Category> Categories { get; set; }

    public DbSet<Product> Products { get; set; }

    public DbSet<Order> Orders { get; set; }

    public DbSet<ProductsInOrder> ProductsInOrders { get; set; }

    public DbSet<Profile> Profiles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<Product>()
            .HasKey(i => i.Id);

        modelBuilder.Entity<Category>()
            .HasKey(i => i.Id );

        modelBuilder.Entity<Order>()
            .HasKey(i => i.Id);

        modelBuilder.Entity<ProductsInOrder>()
            .HasKey(i => i.Id);

        modelBuilder.Entity<Profile>()
            .HasKey(i => i.Id);

        // Orders
        modelBuilder.Entity<Profile>()
            .HasMany(p => p.Orders)
            .WithRequired(i => i.Adder)
            .HasForeignKey(i => i.AdderId)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Profile>()
            .HasMany(p => p.AddedOrders)
            .WithRequired(i => i.Modifier)
            .HasForeignKey(i => i.ModifierId)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Profile>()
            .HasMany(p => p.ModifiedOrders)
            .WithRequired(i => i.Profile)
            .HasForeignKey(i => i.ProfileId)
            .WillCascadeOnDelete(false);

        // Products
        modelBuilder.Entity<Profile>()
            .HasMany(p => p.AddedProducts)
            .WithRequired(i => i.Adder)
            .HasForeignKey(i => i.AdderId)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Profile>()
            .HasMany(p => p.ModifiedProducts)
            .WithRequired(i => i.Modifier)
            .HasForeignKey(i => i.ModifierId)
            .WillCascadeOnDelete(false);

        // Categories
        modelBuilder.Entity<Profile>()
            .HasMany(p => p.AddedCategories)
            .WithRequired(i => i.Adder)
            .HasForeignKey(i => i.AdderId)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Profile>()
            .HasMany(p => p.ModifiedCategories)
            .WithRequired(i => i.Modifier)
            .HasForeignKey(i => i.ModifierId)
            .WillCascadeOnDelete(false);

        // Products in Order
        modelBuilder.Entity<Profile>()
            .HasMany(p => p.AddedProductsInOrders)
            .WithRequired(i => i.Adder)
            .HasForeignKey(i => i.AdderId)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Profile>()
            .HasMany(p => p.ModifiedProductsInOrders)
            .WithRequired(i => i.Modifier)
            .HasForeignKey(i => i.ModifierId)
            .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
    }

}

但是我有这个错误

One or more validation errors were detected during model generation:

Adder: FromRole: NavigationProperty 'Adder' is not valid. Type 'ProductsInOrder' of FromRole 'Profile_AddedProductsInOrders_Target' in AssociationType 'Profile_AddedProductsInOrders' must exactly match with the type 'Category' on which this NavigationProperty is declared on.
Modifier: FromRole: NavigationProperty 'Modifier' is not valid. Type 'ProductsInOrder' of FromRole 'Profile_ModifiedProductsInOrders_Target' in AssociationType 'Profile_ModifiedProductsInOrders' must exactly match with the type 'Category' on which this NavigationProperty is declared on.

我找到了解决方法(下),但是我不明白为什么我不能在抽象类中定义关系。

public abstract class Entity
{
    public int Id { get; set; }

    public DateTime Added { get; set; }

    public DateTime Updated { get; set; }

}

public class Category : Entity
{
    public int AdderId { get; set; }

    public int ModifierId { get; set; }

    public virtual Profile Modifier { get; set; }

    public virtual Profile Adder { get; set; }

    public String Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Order : Entity
{
    public int AdderId { get; set; }

    public int ModifierId { get; set; }

    public virtual Profile Modifier { get; set; }

    public virtual Profile Adder { get; set; }

    public Status Status { get; set; }

    public int ProfileId { get; set; }

    public virtual Profile Profile { get; set; }
}

public class Product : Entity
{
    public int AdderId { get; set; }

    public int ModifierId { get; set; }

    public virtual Profile Modifier { get; set; }

    public virtual Profile Adder { get; set; }

    public string Name { get; set; }

    public int Count { get; set; }

    public double Cost { get; set; }

    public int CategoryId { get; set; }

    public virtual Category Category { get; set; }
}

public class ProductsInOrder : Entity
{
    public int AdderId { get; set; }

    public int ModifierId { get; set; }

    public virtual Profile Modifier { get; set; }

    public virtual Profile Adder { get; set; }

    public int Count { get; set; }

    public double Cost { get; set; }

    public bool Active { get; set; }

    public int ProductId { get; set; }

    public int OrderId { get; set; }

    public virtual Product Product { get; set; }

    public virtual Order Order { get; set; }
}

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

    public string UserName { get; set; }

    public virtual ICollection<Order> Orders { get; set; }

    public virtual ICollection<Order> AddedOrders { get; set; }

    public virtual ICollection<Order> ModifiedOrders { get; set; }

    public virtual ICollection<Category> AddedCategories { get; set; }

    public virtual ICollection<Category> ModifiedCategories { get; set; }

    public virtual ICollection<Product> AddedProducts { get; set; }

    public virtual ICollection<Product> ModifiedProducts { get; set; }

    public virtual ICollection<ProductsInOrder> AddedProductsInOrders { get; set; }

    public virtual ICollection<ProductsInOrder> ModifiedProductsInOrders { get; set; }
}

public enum Status
{
    New,
    ToPay,
    Payed,
    Deliving,
    Delived,
    Returned,
    Cancelled
}

public class ShopContext : DbContext
{
    public ShopContext()
        : base("DefaultConnection")
    {

    }

    public DbSet<Category> Categories { get; set; }

    public DbSet<Product> Products { get; set; }

    public DbSet<Order> Orders { get; set; }

    public DbSet<ProductsInOrder> ProductsInOrders { get; set; }

    public DbSet<Profile> Profiles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<Product>()
            .HasKey(i => i.Id);

        modelBuilder.Entity<Category>()
            .HasKey(i => i.Id );

        modelBuilder.Entity<Order>()
            .HasKey(i => i.Id);

        modelBuilder.Entity<ProductsInOrder>()
            .HasKey(i => i.Id);

        modelBuilder.Entity<Profile>()
            .HasKey(i => i.Id);

        // Orders
        modelBuilder.Entity<Profile>()
            .HasMany(p => p.Orders)
            .WithRequired(i => i.Adder)
            .HasForeignKey(i => i.AdderId)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Profile>()
            .HasMany(p => p.AddedOrders)
            .WithRequired(i => i.Modifier)
            .HasForeignKey(i => i.ModifierId)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Profile>()
            .HasMany(p => p.ModifiedOrders)
            .WithRequired(i => i.Profile)
            .HasForeignKey(i => i.ProfileId)
            .WillCascadeOnDelete(false);

        // Products
        modelBuilder.Entity<Profile>()
            .HasMany(p => p.AddedProducts)
            .WithRequired(i => i.Adder)
            .HasForeignKey(i => i.AdderId)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Profile>()
            .HasMany(p => p.ModifiedProducts)
            .WithRequired(i => i.Modifier)
            .HasForeignKey(i => i.ModifierId)
            .WillCascadeOnDelete(false);

        // Categories
        modelBuilder.Entity<Profile>()
            .HasMany(p => p.AddedCategories)
            .WithRequired(i => i.Adder)
            .HasForeignKey(i => i.AdderId)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Profile>()
            .HasMany(p => p.ModifiedCategories)
            .WithRequired(i => i.Modifier)
            .HasForeignKey(i => i.ModifierId)
            .WillCascadeOnDelete(false);

        // Products in Order
        modelBuilder.Entity<Profile>()
            .HasMany(p => p.AddedProductsInOrders)
            .WithRequired(i => i.Adder)
            .HasForeignKey(i => i.AdderId)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Profile>()
            .HasMany(p => p.ModifiedProductsInOrders)
            .WithRequired(i => i.Modifier)
            .HasForeignKey(i => i.ModifierId)
            .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
    }

}

0 个答案:

没有答案