0

Я пытаюсь правильно структурировать свою базу данных для своего веб-приложения. Я не уверен в правильном способе работы с ключами и отношениями. В основном ..ASP Entity Framework - Код FIrst - Дизайн данных - Ключи

Моего проект содержит продукта

, который может содержать много отчетов, однако, тот же отчет может не относятся к нескольким продуктам.

У меня есть Пользователи, у которых может быть много доступных для них отчетов .. независимо от родительского продукта отчетов.

Моя структура до сих пор

public class Product 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 


public class Report 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual Product Product { get; set; } 
} 


public class User 
{ 
    [Key] 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public virtual ICollection<Report> Reports { get; set; } 
} 


И Seed

protected override void Seed(Insight.Data.InsightDb context) 
    { 
     context.Products.AddOrUpdate(p => p.ProductID, 
      new Product { ProductName = "Product 1" }, 
      new Product { ProductName = "Product 2" } 
     ); 

     context.Reports.AddOrUpdate(p => p.ReportID, 
      new Report { ReportName = "Report A", ProductID = 1, }, 
      new Report { ReportName = "Report B", ProductID = 1, }, 
      new Report { ReportName = "Report C", ProductID = 1, }, 
      new Report { ReportName = "Report D", ProductID = 2, }, 
      new Report { ReportName = "Report E", ProductID = 2, } 
     ); 

     context.Users.AddOrUpdate(u => u.UserID, 
      new User { FirstName = "Frank", LastName = "Reynolds", }, 
      new User { FirstName = "Dee", LastName = "Reyonolds", } 
     ); 
    } 

Я не уверен, как правильно назначить отчеты к пользователей или даже знать, если я нахожусь на правильном пути. Кроме того, есть ли более эффективная практика, чем использование int в качестве ключа?

+1

ЗАКАНЧИВАТЬ редактировать я только что сделал для вашей модели. Может быть, это поможет немного. Если я правильно понимаю, вы хотите, чтобы Пользователь, у которого есть список связанных с ними отчетов, и вы хотите получить уникальный продукт в каждом из этих отчетов? –

+0

Спасибо. Модели сущностей правильно выравниваются, как только я нахожусь на сервере SQL, и заполняю и запрашиваю таблицы вручную. Можете ли вы предложить пример, чтобы заполнить их соответствующим образом внутри моего кода C# внутри Seed()? – scniro

ответ

1

В то время как я не использовал подход, у вас есть выше .. вот мой удар в нем:

protected override void Seed(Insight.Data.InsightDb context) 
{ 
    var product1 = new Product{ Name = "Product 1"}; 
    var product2 = new Product{ Name = "Product 2"}; 
    var reports1 = new List<Report> 
    { 
     new Report { Name = "Report A", Product = product1, }, 
     new Report { Name = "Report B", Product = product1, }, 
     new Report { Name = "Report C", Product = product1, }, 
     new Report { Name = "Report D", Product = product2, }, 
     new Report { Name = "Report E", Product = product2, } 
    }; 

    context.Products.AddOrUpdate(p => p.ProductID, 
     product1, 
     product2 
    ); 

    context.Reports.AddOrUpdate(p => p.ReportID, 
     reports1 
    ); 

    context.Users.AddOrUpdate(u => u.UserID, 
     new User { FirstName = "Frank", LastName = "Reynolds", Reports = reports1 }, 
     new User { FirstName = "Dee", LastName = "Reyonolds" }, 
    ); 
} 

Я просто не уверен, что если настройка отчетов часть является правильным (добавление списка в AddOrUpdate), так что вам, возможно, придется заглянуть, если это не сработает.

+0

Интересно. Я вижу, что здесь происходит. Я попытался, например, добавить 'report1' в Dee Reynolds (так что они будут иметь тот же отчет) и получить сообщение об ошибке: коллекция была изменена; операция перечисления может не выполняться. Я также вынул Reoirts.AddOrUpdate ... – scniro

+1

Можете ли вы сделать что-нибудь вроде context.Users.AddOrUpdate (........). С помощью (// Здесь вы должны добавить отчеты)? Это что-то вроде: http://stackoverflow.com/questions/11263542/one-to-many-in-code-first-entity-framework-model-how-do-the-relationships-work, но опять же, просто не уверен о синтаксисе. –

+0

Вы ищете сопоставление «один ко многим», если это вообще помогает. –

0

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

public class Report 
{ 
    [Key] 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public virtual Product Product { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
} 

public class User 
{ 
    [Key] 
    public int Id { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public virtual ICollection<Report> Reports { get; set; } 
} 


Затем, чтобы заполнить свои данные с кодом первого подхода

protected override void Seed(Insight.Data.InsightDb context) 
{ 
    Product product1 = new Product { Name = "Product 1" }; 
    Product product2 = new Product { Name = "Product 2" }; 

    Report reportA = new Report { Name = "Report A", Product = product1 }; 
    Report reportB = new Report { Name = "Report B", Product = product1 }; 
    Report reportC = new Report { Name = "Report C", Product = product1 }; 
    Report reportD = new Report { Name = "Report D", Product = product2 }; 
    Report reportE = new Report { Name = "Report E", Product = product2 }; 

    List<User> users = new List<User>(); 

    users.Add(new User { FirstName = "Dee", LastName = "Reynolds", Reports = new List<Report>() { reportA, reportB, reportC } }); 
    users.Add(new User { FirstName = "Frank", LastName = "Reynolds", Reports = new List<Report>() { reportC, reportD, reportE } }); 

    users.ForEach(b => context.Users.Add(b)); 
} 
Смежные вопросы