entity framework code first fluent api


Я впервые использую fluent api . Я могу установить отношения, используя отношения один ко многим и многие ко многим.

Но у меня есть разъяснение, используя отношение один-к-одному.

У меня есть две таблицы tabla и tableB, где tabla имеет два поля

public class tableA
{
 public int tAId {get;set;}
 public string desc {get;set;}
 public tableB tableB {get;set;}
}

И tableB имеет следующие поля:

public class tableB
{
  public int tBId {get;set;}
  public int refKeyfromTableA{get;set;}
  public string somedesc{get;set;}
  public tableA tableA {get;set;}

}

Я определяю ограничения в отдельном классе, например:

public class tableAConfig:BaseEntity<tableA>
{
public tableAConfig()
{
  HasKey(p=>p.tAId);
Property(p=>p.tAId).IsRequired();

//This line has syntatical error
HasForeignKey(p=>p.tAId);
}
}

Как определить отношение внешнего ключа в указанном выше классе в коде первый подход?

2 4

2 ответа:

Определите класс конфигурации fluent api следующим образом:

public class tableAConfig:BaseEntity<tableA>
{
    public tableAConfig()
    {
        HasKey(p=>p.tAId);

        HasOptional(p => p.tableB )
            .WithRequired( p => p.tableA );
    }
}

Учтите, что свойство refkeyfromtableа на объекте tableB бесполезно, так как между первичными ключами формируется взаимно однозначное отношение в базе данных. Таким образом, в вашем случае 2 сущности связаны, если их столбцы tAId и tBId имеют одинаковое значение. Таким образом, значения для первичного ключа хотя бы одной из сущностей не могут быть обобщены базой данных. Например, в конфигурации tableB вы можете сделать это следующим образом: образом:

Property(e => e.tBId)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

Помимо метода WithRequired вы можете также использовать методы WithOptionalDependent и WithOptionalPrincipal для формирования отношений один-к-одному, как вы хотите.

Я не сделал 1:1 с fluent API, но я сделал это с атрибутами. Я исправил пример кода, демонстрирующий атрибутивный подход, чтобы быть совместимым с вашим примером, возможно, это будет полезно для вас:

public class tableA
{
    public int Id { get; set; }

    public string desc { get; set; }

    public tableB tableB { get; set; }
}

public class tableB
{
    // In one-to-one relationship, one end must be principal and second end must be dependent. 
    // tableA is the one which will be inserted first and which can exist without the dependent one. 
    // tableB end is the one which must be inserted after the principal because it has foreign key to the principal.

    [Key, ForeignKey("tableA")]
    public int Id { get; set; }

    // 'Required' attribute because tableA must be present
    // in order for a tableB to exist
    [Required]
    public virtual tableA tableA { get; set; }

    public string somedesc { get; set; }
}