Как определять многообразные связи к той же таблице используя Энтитифрамеворк Кодефирст и FluentApi?

У меня есть деталь со связью 3 подмостков:

У меня есть мало названный 'Местожительство' упрощенной формы, будь в следующей форме:

public class Domicilio
{
    public int Id { get; set; }
    public string Direccion { get; set; }
    public int? ClienteId { get; set; }
    public Cliente Cliente { get; set; }
    public int? ProveedorId { get; set; }
    public Proveedor Proveedor { get; set; }
    public int? EmpresaId { get; set; }
    public Empresa Empresa { get; set; }
}

И три Немногие более названные 'Клиент', 'Поставщик' и 'Предприятие'

 public class Cliente
{
    public int Id { get; set; }
    public string Nombre { get; set; }
    public List<Domicilio> Domicilios { get; set; }
}

public class Proveedor
{
    public int Id { get; set; }
    public string Nombre { get; set; }
    public List<Domicilio> Domicilios { get; set; }
}

public class Empresa
{
    public int Id { get; set; }
    public string Nombre { get; set; }
    public Domicilio Domicilio { get; set; }
}

У поставщика и Клиента есть много Местожительства, даже там без проблем. Деталь - со связью одна в один или один в нуль, между Предприятием и Местожительством.

Я думаю, что чужеземный ключ должен идти в таблице местожительства указывая в Id предприятия посредством свойства EmpresaId. Но мне не удается заставить это функционировать и реестры просто сохраняют, не дружа в базе данных.

Я использую FluentApi для конфигурации упрощенной формы.
Это код:

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Cliente>()
            .ToTable("clientes")
            .HasMany(c => c.Domicilios)
            .WithOptional(d => d.Cliente)
            .HasForeignKey(d => d.ClienteId);

        modelBuilder.Entity<Proveedor>()
            .ToTable("proveedores")
            .HasMany(p => p.Domicilios)
            .WithOptional(d => d.Proveedor)
            .HasForeignKey(d => d.ProveedorId);

        modelBuilder.Entity<Empresa>()
            .ToTable("empresas")
            .HasOptional(e => e.Domicilio)
            .WithOptionalPrincipal(d => d.Empresa);

        modelBuilder.Entity<Domicilio>()
            .ToTable("domicilios");
    }

Какова ошибка?

Возможно с EntityFramework, что таблица ведет себя с HasMany для неких организаций и с HasOptional или HasRequired для других?

Как я определяю, что чужеземный ключ предприятия EmpresaId в таблице Местожительство используя FluentApi?

1
задан 19.12.2016, 08:00
2 ответа

Связи Entity framework, которые polimofirmo, возможно устанавливать как нормальное наследство класса: ИЗДАННЫЕ

public class Domicilio
{
  public int Id { get; set; }
public string Direccion { get; set; }
public int? ClienteId { get; set; }
public Cliente Cliente { get; set; }
public int? ProveedorId { get; set; }
public Proveedor Proveedor { get; set; }


}
    public class Empresa : Domicilio
    {

public string Nombre { get; set; }

    }

: Для связей наследства в EF это не necerario declar класс такая дочь как dbset в DbContext ни harГ - в отсутствие объявлять Ваши связи. Только irГ - в отца, что этот случай serГ - в Местожительство:

В Dbcontext она incluirГ - в asГ -

public dbset<Domicilio> Domicilio {set;get;}

, Если он имеет realaciГі с другой таблицей serГ - в asГ-:

один один по отношению ко многому

modelBuilder.Entity<Domicilio>()
                .HasMany(e => e.Tabla1)
                .WithRequired(e => e.ObjectDomicilio)//Esto es lo unico que cambia
                .HasForeignKey(e => e.DomicilioId)

В этом случае ты не имел бы по отношению к одному

modelBuilder.Entity<Domicilio>()
               .HasMany(e => e.Tabla1)
               .WithOptional(e => e.ObjectDomicilio)
               .HasForeignKey(e => e.DomicilioId);

прямой доступ к Предприятию с Dbcontext, но если ты можешь соглашаться на Ваши данные как asГ-:

using(var context=new Dbcontext)
{
(Empresa)context.Domicilio.where(x=>x.ClienteId==1).tolist();
}

В этом случае ты retornarГ - во все местожительство, у которого есть связь с клиентом 1 и - типа Предприятие.

1
ответ дан 24.11.2019, 13:22
  • 1
    Интересный, не hab и # 237; в думая об этом soluci и # 243; n. Но это har и # 237; в который EntityFramework верит в таблицу Предприятия с полем и #39; имя и # 39; м и # 225; s все поля Местожительства, чтобы сохраняться данные и #191; верный? –  David Zavaleta 16.09.2016, 05:17
  • 2
    @David Zavaleta No, только быть созданным и # 225; таблица Предприятие с данными о ней а именно Назвало и идентификация, которая состояла бы elmismo в том, что идет существовать в Таблице, Я Поселяю, и таблица Поселила с Вашими Данными, было бы более или менее таким Предприятие {Id=1, Имя = и quot; Pepe"} и Я Поселяю {Id=1, Адрес = и quot; LOSPESA" ClienteID=1, ProvedorId=1}, ты понимаешь –  Frank Núñez Rodríguez 16.09.2016, 15:42
  • 3
    Я понимаю и #191; но тогда то, что ты предлагаешь, производит relaci и # 243; n один в один? в этом случае идентификация предприятия будет являться тем же самым, что идентификация местожительства. А именно, если идентификация местожительства идет в номере 100, хотя предприятие будет введенной первой и #191; будешь иметь один пойдите 100, чтобы совпадать с Id в таблице местожительство? –  David Zavaleta 19.09.2016, 18:26
  • 4
    Используя твои знания EF. Я хочу произвести в таблице Предприятия поле DomicilioId, и которое было бы моим иностранным ключом указывая на местожительство. и #191; правилен этот configuraci и # 243; n? modelBuilder. Entity< Empresa> ().ToTable (" empresas").HasRequired (и = > и. Я поселяю).WithMany ().HasForeignKey (и = > и. DomicilioId); –  David Zavaleta 19.09.2016, 18:40
  • 5
    @David Савалета así будь должен функционировать для relació n от одного до одного год. –  Frank Núñez Rodríguez 30.01.2018, 17:49

Какой я прокомментировал тебе, наихудшая идея работать с одной relaciГіn polimГіrfica ВїPor quГ© ты не должен использовать связи polimГіrficas?

Организации дела состоит в том, чтобы воплощать реальный мир, в одном diseГ±o дела, у каждой организации есть их собственные признаки.

Modelo de negocio

Организации дела поставляют informaciГіn другие организации, которые тратят их.

0
ответ дан 24.11.2019, 13:22
  • 1
    Если я понимаю эту часть, я верю в то, что formul и # 233; плохо мой вопрос. Мое незнание EntityFramework я llev и # 243; чтобы думать об альтернативе, похожей на то, что делает ActiveRecord, и в действительности он не нуждался в этом. Только он нуждался в том, чтобы определить configuraci и # 243; n добавочный в FluentApi. и #161; Спасибо! –  David Zavaleta 19.09.2016, 18:37