entity framework代码先行api
entity framework code first fluent api
我是第一次使用流利的api。我能够使用一对多和多对多关系建立关系。
但我有一个使用一对一关系的澄清。
我有两个表 tableA 和 tableB,其中 tableA 有两个字段
public class tableA
{
public int tAId {get;set;}
public string desc {get;set;}
public tableB tableB {get;set;}
}
表 B 有以下字段:
public class tableB
{
public int tBId {get;set;}
public int refKeyfromTableA{get;set;}
public string somedesc{get;set;}
public tableA tableA {get;set;}
}
我在单独的 class 中定义约束,例如 :
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);
}
}
上面class代码优先方式中的外键关系如何定义?
流利的API我没做过1:1,但是属性我做过。我修复了一个代码示例来演示属性方法以与您的示例保持一致,也许它会对您有所帮助:
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; }
}
定义您的流利 api 配置 class 如下:
public class tableAConfig:BaseEntity<tableA>
{
public tableAConfig()
{
HasKey(p=>p.tAId);
HasOptional(p => p.tableB )
.WithRequired( p => p.tableA );
}
}
考虑到 tableB 实体上的 属性 refKeyfromTableA 是无用的,因为数据库中的 one-to-one 关系是在主键之间形成的。因此,在您的情况下,如果 2 个实体的 tAId 和 tBId 列具有相同的值,则它们是相关的。因此,数据库无法生成至少一个实体的主键值。例如,在 tableB 的配置中,您可以按如下方式进行:
Property(e => e.tBId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
除了 WithRequired 方法之外,您还可以使用 WithOptionalDependent 和 WithOptionalPrincipal 方法来根据需要形成 one-to-one 关系。
我是第一次使用流利的api。我能够使用一对多和多对多关系建立关系。
但我有一个使用一对一关系的澄清。
我有两个表 tableA 和 tableB,其中 tableA 有两个字段
public class tableA
{
public int tAId {get;set;}
public string desc {get;set;}
public tableB tableB {get;set;}
}
表 B 有以下字段:
public class tableB
{
public int tBId {get;set;}
public int refKeyfromTableA{get;set;}
public string somedesc{get;set;}
public tableA tableA {get;set;}
}
我在单独的 class 中定义约束,例如 :
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);
}
}
上面class代码优先方式中的外键关系如何定义?
流利的API我没做过1:1,但是属性我做过。我修复了一个代码示例来演示属性方法以与您的示例保持一致,也许它会对您有所帮助:
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; }
}
定义您的流利 api 配置 class 如下:
public class tableAConfig:BaseEntity<tableA>
{
public tableAConfig()
{
HasKey(p=>p.tAId);
HasOptional(p => p.tableB )
.WithRequired( p => p.tableA );
}
}
考虑到 tableB 实体上的 属性 refKeyfromTableA 是无用的,因为数据库中的 one-to-one 关系是在主键之间形成的。因此,在您的情况下,如果 2 个实体的 tAId 和 tBId 列具有相同的值,则它们是相关的。因此,数据库无法生成至少一个实体的主键值。例如,在 tableB 的配置中,您可以按如下方式进行:
Property(e => e.tBId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
除了 WithRequired 方法之外,您还可以使用 WithOptionalDependent 和 WithOptionalPrincipal 方法来根据需要形成 one-to-one 关系。