Как бороться с этой десятичной ошибкой за цену? - PullRequest
0 голосов
/ 27 сентября 2019

Я работаю над этим приложением, которое должно показывать на "localhost / catalog" некоторые данные.У меня есть библиотека для моделей и сервисов, которые может использовать приложение.Я получаю эту ошибку:

InvalidOperationException: The property 'Price' is not a navigation 
property of entity type 'StoreAsset'. The 'Include(string)' method can 
only be used with a '.' separated list of navigation property names.Microsoft.EntityFrameworkCore.Query.Internal.IncludeCompiler.WalkNavigations(IEntityType entityType, IReadOnlyList<string> navigationPropertyPaths, IncludeLoadTree includeLoadTree, bool shouldThrow)

Вот код, который я использую (контроллер, модели и представление) и методы обслуживания внизу:

public class CatalogController : Controller
{
    private IStoreAsset _assets;

    public CatalogController(IStoreAsset assets)
    {
        _assets = assets;
    }

    public ActionResult Index()
    {
        var assetModels = _assets.GetAll();

        var listingResult = assetModels
            .Select(result => new AssetIndexListingModel
            {
                Id = result.Id,
                Tipology = _assets.GetTipology(result.Id),
                Size = _assets.GetSize(result.Id),
                Price = decimal.Parse(_assets.GetPrice(result.Id))                 
            });

        var model = new AssetIndexModel()
        {
            Assets = listingResult
        };

        return View(model);
    }

public class AssetIndexListingModel
{
    public int Id { get; set; }
    public string Size { get; set; }
    public decimal Price { get; set; }
    public string Tipology { get; set; }
    public string ImageUrl { get; set; }
}

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

    [Required]
    public Status Status { get; set; }

    [Required]
    public decimal Price { get; set; }

    public string ImageUrl { get; set; }
}

public class Dress : StoreAsset
{        
    [Required]
    public string Color { get; set; }

    [Required]
    public string Tipology { get; set; }

    [Required]
    public string Size { get; set; }
}

@model Models.Catalog.AssetIndexModel

<div id="assets">
<h3></h3>
<div id="assetsTable">
    <table class="table table-condensed" id="catalogIndexTable">
        <thead>
            <tr>
                <th>Size</th>
                <th>Price</th>
                <th>Tipology</th>                 
            </tr>
        </thead>
        <tbody>
            @foreach (var asset in Model.Assets)
            {
            <tr class="assetRow">
                <td class="">
                    <a asp-controller="Catalog" asp-action="Detail" asp-route-id="@asset.Id">
                        <img src="@asset.ImageUrl" class="imageCell" />
                    </a>                        
                </td>
                <td class="">@asset.Price</td>
                <td class="">@asset.Size</td>
                <td class="">@asset.Tipology</td>
            </tr>
            }
        </tbody>
    </table>
</div>

public class StoreAssetService : IStoreAsset
{
    private Context _context;

    public StoreAssetService(Context context)
    {
        _context = context;
    }

    public void Add(StoreAsset newAsset)
    {
        _context.Add(newAsset);
        _context.SaveChanges();
    }

    public IEnumerable<StoreAsset> GetAll()
    {
        return _context.StoreAssets
            .Include(asset => asset.Status)
            .Include(asset => asset.Price);
    }

    public StoreAsset GetById(int id)
    {
        // Return a query (same as returning GetAll().FirstOrDefault(...))
        return _context.StoreAssets
                .Include(assets => assets.Status)
                .Include(assets => assets.Price)
                // So it can return null with no problem
                .FirstOrDefault(asset => asset.Id == id);
    }

    public StoreBranch GetCurrentLocation(int id)
    {
        throw new NotImplementedException();
    }

    // To implement and test
    public string GetPrice(int id)
    {           
        return _context.Dresses.FirstOrDefault(p => p.Id == id).Price.ToString();
    }

    public string GetSize(int id)
    {
        return _context.Dresses.FirstOrDefault(s => s.Id == id).Size;
    }

    public string GetStatus(int id)
    {
        throw new NotImplementedException();
    }

    public string GetTipology(int id)
    {
        var dress = _context.StoreAssets.OfType<Dress>()
            .Where(b => b.Id == id);

        // For now return other if it's not a party dress
        return dress.Any() ? "Party" : "Other";
    }
}

Должен ли я использовать какой-либо атрибут ForeignKey или изменить Price на строку?Любая помощь будет велика, спасибо

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Как указано в сообщении об ошибке, Include предназначено только для свойства Navigation.

Вам необходимо изменить следующее:

return _context.StoreAssets
        .Include(asset => asset.Status)
        .Include(asset => asset.Price);

Кому:

return _context.StoreAssets
        .Include(asset => asset.Status).ToList();

Ссылка: https://docs.microsoft.com/en-us/ef/core/modeling/relationships#definition-of-terms

https://docs.microsoft.com/en-us/ef/core/querying/related-data

0 голосов
/ 27 сентября 2019

У меня есть еще одна проблема.Когда я захожу в "localhost / catalog", на странице должны отображаться все столбцы / записи, которые есть в базе данных, но отображается только один столбец.Что-то не так в цикле foreach?

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