Не могу сделать миграцию - PullRequest
       8

Не могу сделать миграцию

0 голосов
/ 26 апреля 2020

Я занимаюсь сайтом и мне нужно использовать EF. Но когда я начинаю выполнять миграцию, у меня появляется ошибка U , которая не позволяет определить отношение, представленное свойством навигации «Category.tablets» типа «ICollection». Либо настройте отношение вручную, либо игнорируйте это свойство с помощью атрибута [NotMapped] или с помощью EntityTypeBuilder.Ignore в OnModelCreating. This Tablets.cs

publi c class Tablets {

public int id { set; get; }

public string name { set; get; }

public string shortDesc { set; get; }

public string longDesc { set; get; }

public string img  { set; get; }

public ushort price { set; get; }

public bool IsFavorite { set; get; }

public bool available { set; get; }

public int categoryID { set; get; }
public int availableOnSklad { get; set; }

public virtual Category Category1 { set; get; }
public virtual Category Category2 { set; get; }
public virtual Category Category3 { set; get; }

public virtual OrganyVplyvu OrganVplyvu1 { set; get; }
public virtual OrganyVplyvu OrganVplyvu2 { set; get; }
public virtual OrganyVplyvu OrganVplyvu3 { set; get; }

public virtual Hvoroby Hvoroba1 { set; get; }
public virtual Hvoroby Hvoroba2 { set; get; }
public virtual Hvoroby Hvoroba3 { set; get; }

}

Category.cs

public class Category
{
    public int id { set; get; }
    public string CategoryName { set; get; }
    //public string Description { set; get; }

    public ICollection<Tablets> tablets { set; get; }

}

Hvoroby.cs

 public class Hvoroby
    {
        public int id { set; get; }
        public string HvorobyName { set; get; }
        //public string Description { set; get; }
        public  ICollection<Tablets> tablets { set; get; }
    }

OrganyVplyvu.cs

public class OrganyVplyvu
    {
        public int id { set; get; }
        public string OrganName { set; get; }
        //public string Description { set; get; }
        public  ICollection<Tablets> tablets { set; get; }
    }

Startup.cs

 public class Startup
    {
        private IConfigurationRoot _config;
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;

        }
        public Startup(IWebHostEnvironment hostenv)
        {
            _config = new ConfigurationBuilder().SetBasePath(hostenv.ContentRootPath).AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile("appsettings.Development.json", optional: true)
                .AddEnvironmentVariables().Build();
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            Configuration.Bind("Data", new Config());

            services.AddControllersWithViews().SetCompatibilityVersion(CompatibilityVersion.Version_3_0).AddSessionStateTempDataProvider();

            services.AddDbContext<AppDBContent>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
            services.AddTransient<IAllTablets, TabletsReposetori>();
            services.AddTransient<ITabletsCategory, CategoryReposetori>();
            services.AddTransient<IAllOrganyVplyvu, OrganyVplyvuReposetori>();
            services.AddTransient<IAllHvoroby, HvorobyReposetory>();


            services.AddMvc();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment()) app.UseDeveloperExceptionPage();
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();
            app.UseCookiePolicy();
            app.UseAuthentication();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

и appsettings . json

{
  "ConnectionStrings": {
    "DefaultConnection": "Source=MyDataSource;Initial Catalog=MyCatalog;Trusted_Connection=True"
  }

}

Я не хочу использовать [Not Mapped], потому что все поля необходимы. Я искал на Inte rnet и нашел некоторые решения, но я все еще не понимаю, как это исправить.

1 Ответ

2 голосов
/ 26 апреля 2020

Я полагаю, это потому, что у вас есть три свойства навигации от Tablets до Category:

public virtual Category Category1 { set; get; }
public virtual Category Category2 { set; get; }
public virtual Category Category3 { set; get; }

Но Tablets имеет только одно categoryID. Итак, как EF может определить, принадлежит ли categoryID к Category1, Category2 или Category3, если вы специально не отобразите его?

То же самое относится к свойству ICollection<Tablets> tablets Category - это набор планшетов, где Category равен Category1, Category2 или Category3?

Я не совсем уверен, каковы ваши потребности, но вы можете попробовать добавить эти свойства в Tablets:

public int category1ID { set; get; }
public int category2ID { set; get; }
public int category3ID { set; get; }

и удалите существующее свойство categoryID

Тогда вам также необходимо добавить соответствующие коллекции в Category:

public ICollection<Tablets> tablets1 { set; get; }
public ICollection<Tablets> tablets2 { set; get; }
public ICollection<Tablets> tablets3 { set; get; }

Для каждой записи Category эти коллекции будут содержать отношения, в которых она сопоставляется со свойством Category1, Category2 или Category3 записи Tablets соответственно.

В порядке чтобы это работало, вам, вероятно, потребуется вручную сопоставить все эти свойства (либо с атрибутами, либо в методе OnModelCreating, как упоминается в ошибке).

Однако я думаю, что вам будет лучше, если таблица соединения «многие ко многим», например TabletCategories, так как этот текущий дизайн похож Это может вызвать больше проблем в будущем.

Примерно так можно указать дополнительную информацию о конкретных отношениях (при необходимости):

public class TabletCategory
{
    public int TabletId { set; get; }
    public int CategoryId { set; set; }
}

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

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