Отключить соглашение об именах для свойства навигации ef-core2.2 - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь использовать класс идентичности внутри своего доменного объекта, но когда я хочу создать миграцию для создания базы данных, ef core 2.2 говорит мне:

System.Reflection.TargetInvocationException: исключение былоброшенный целью вызова.---> System.InvalidOperationException: «Склад» нельзя использовать в качестве свойства для типа сущности «Существование», поскольку он настроен как навигация.

Мой dbcontext равен

public class WarehousesContext : BaseContext<WarehousesContext>
{
    public WarehousesContext(DbContextOptions<WarehousesContext> options) : base(options)
    {

    }
    public WarehousesContext() : base() { }
    public DbSet<Warehouse> Warehouses { get; set; }
    public DbSet<Existence> Existences { get; set; }
    public DbSet<Entry> Entries { get; set; }
    public DbSet<Exit> Exits { get; set; }
    public DbSet<Transfer> Transfers { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.HasDefaultSchema("Inventory");
        modelBuilder.Entity<Warehouse>().ToTable("Warehouses");
        modelBuilder.Entity<Warehouse>().HasKey(w => w.Id);
        modelBuilder.Entity<Warehouse>().Property(w => w.Id).HasConversion(v => v.Id, v => new WarehouseId(v));
        modelBuilder.Entity<Existence>().ToTable("Existences");
        modelBuilder.Entity<Existence>().HasKey(e => e.Id);
        modelBuilder.Entity<Existence>().Property(e => e.Id).HasConversion(v => v.Id, v => new ExistenceId(v));
        modelBuilder.Entity<Existence>().OwnsOne(e => e.Warehouse);
        modelBuilder.Entity<Existence>().OwnsOne(e => e.Product);
    }

}

мой класс существования -

    public class Existence
{
    public ExistenceId Id { get; private set; }
    public WarehouseId Warehouse { get; private set; }
    public ProductId Product { get; private set; }
    public decimal Quantity { get; private set; }
    public string Batch { get; private set; }
    private Existence() { }
    public Existence(WarehouseId warehouse, ProductId product, decimal quantity, string batch)
    {
        Warehouse = warehouse;
        Product = product;
        Quantity = quantity;
        Batch = batch;
    }

    internal void Add(decimal quantity)
    {
        Quantity += quantity;
    }

    internal void Subtract(decimal quantity)
    {
        Quantity -= quantity;
        if (Quantity < 0)
            throw new Exception();
    }

, а мой класс warehouseId

public class WarehouseId 
{
    public string Id { get; private set; }
    public WarehouseId()
    {
        this.Id = Guid.NewGuid().ToString();
    }
    public WarehouseId(string id)
    {
        Id = id;
    }
}

Я думаю, проблема в том, что я использую шаблон "entityId", чтобы назвать свой класс идентификации, поэтому я хочузнать, если есть какой-то способ сказать ядру "не пытайтесь использовать конвекцию свойства навигации здесь"

1 Ответ

0 голосов
/ 07 декабря 2018

Измените свой класс Существования, как показано ниже (вы можете добавить свои методы соответственно)

public class Existence
{
    public string Id { get; private set; }

    [ForeignKey("Warehouse")]   
    public string WarehouseId { get; private set; }
    public ProductId Product { get; private set; }
    public decimal Quantity { get; private set; }
    public string Batch { get; private set; }

    public virtual Warehouse Warehouse{get;set;)
}

public class Warehouse
{
    //your other Warehouse properties

    //add below line, if one to one relation
    public virtual Existence Existence{get; set;}
    //or, add below line, if one to many relation
    //public virtual IList<Existence> Existence{get; set;}
}

Удалите строки ниже из метода OnModelCreating,

modelBuilder.Entity<Existence>().OwnsOne(e => e.Warehouse);
modelBuilder.Entity<Existence>().OwnsOne(e => e.Product);

, и вы можете обратиться к ТАКому вопросу, чтобыисправить вашу идентификацию.

Как Entity Framework генерирует GUID для значения первичного ключа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...