首先使用 EF 代码映射组合键

Sql 服务器表:

SomeId PK varchar(50) not null
OtherId PK int not null

我应该如何映射这在 EF6代码第一?

public class MyTable
{
[Key]
public string SomeId { get; set; }


[Key]
public int OtherId { get; set; }
}

我看过一些例子,你必须为每一列设置顺序,这是必需的吗?

这上面有官方文件吗?

143872 次浏览

您肯定需要输入列顺序,否则 SQLServer 如何知道哪一个先输入?以下是您在代码中需要做的事情:

public class MyTable
{
[Key, Column(Order = 0)]
public string SomeId { get; set; }


[Key, Column(Order = 1)]
public int OtherId { get; set; }
}

您还可以查看 这个所以问题。如果您想要正式的文档,我建议您查看 EF 官方网站。希望这个能帮上忙。

编辑: 我刚刚发现 Julie Lerman 的一篇博文,里面有各种 EF 6的链接。你可以找到任何你需要的 给你

通过配置,您可以这样做:

Model1
{
int fk_one,
int fk_two
}


Model2
{
int pk_one,
int pk_two,
}

然后在上下文配置

public class MyContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Model1>()
.HasRequired(e => e.Model2)
.WithMany(e => e.Model1s)
.HasForeignKey(e => new { e.fk_one, e.fk_two })
.WillCascadeOnDelete(false);
}
}

对于使用实体框架映射组合主键,我们可以使用两种方法。

1) 通过重写 OnModelcreate ()方法

对于 ex: 我有一个模型类,名字叫车辆特性,如下所示。

public class VehicleFeature
{
public int VehicleId { get; set; }
public int FeatureId{get;set;}
public Vehicle Vehicle{get;set;}
public Feature Feature{get;set;}
}

我的 DBContext 中的代码会像这样,

public class VegaDbContext : DbContext
{
public DbSet<Make> Makes{get;set;}


public DbSet<Feature> Features{get;set;}
public VegaDbContext(DbContextOptions<VegaDbContext> options):base(options)
{


}
// we override the OnModelCreating method here.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<VehicleFeature>().HasKey(vf=> new {vf.VehicleId, vf.FeatureId});
}
}

2) 数据注释。

public class VehicleFeature
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int VehicleId { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int FeatureId{get;set;}
public Vehicle Vehicle{get;set;}
public Feature Feature{get;set;}
}

详情请参阅以下连结。

1) https://msdn.microsoft.com/en-us/library/jj591617(v=vs.113).aspx

2) 如何添加一个复合唯一的关键使用 EF6流畅的 Api?

我想我会添加到这个问题,因为它是顶部谷歌搜索结果。

正如在评论中已经指出的,在 EF Core 中不支持使用注释(关键属性) ,而且必须使用流畅的方式。

当我在从 EF6到 EF Core 的大规模迁移中工作时,这是令人讨厌的,所以我尝试通过使用反射来查找 Key 属性,然后在 OnModelCreate 中应用它

// get all composite keys (entity decorated by more than 1 [Key] attribute
foreach (var entity in modelBuilder.Model.GetEntityTypes()
.Where(t =>
t.ClrType.GetProperties()
.Count(p => p.CustomAttributes.Any(a => a.AttributeType == typeof(KeyAttribute))) > 1))
{
// get the keys in the appropriate order
var orderedKeys = entity.ClrType
.GetProperties()
.Where(p => p.CustomAttributes.Any(a => a.AttributeType == typeof(KeyAttribute)))
.OrderBy(p =>
p.CustomAttributes.Single(x => x.AttributeType == typeof(ColumnAttribute))?
.NamedArguments?.Single(y => y.MemberName == nameof(ColumnAttribute.Order))
.TypedValue.Value ?? 0)
.Select(x => x.Name)
.ToArray();


// apply the keys to the model builder
modelBuilder.Entity(entity.ClrType).HasKey(orderedKeys);
}

我还没有在所有情况下完全测试它,但它在我的基本测试工作。希望这有所帮助