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 ответа:
Определите класс конфигурации 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; } }