是否可以在Entity Framework代码中首先使用数据注释同时拥有一个主键和组合键?

时间:2017-04-23 07:03:39

标签: entity-framework ef-code-first data-annotations ef-fluent-api

public class Test
{
    [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int TestId { get; set; }

    [Column(Order = 0)]
    public string TestName { get; set; }

    [Column(Order = 1)]
    public string TestVersion { get; set; }

    public string TestRef { get; set; }
}

以上应该导致以下SQL

CREATE TABLE [dbo].[Test]
(
    [TestId] INT NOT NULL IDENTITY(1,1),
    [TestName] VARCHAR(40) NOT NULL, 
    [TestVersion] VARCHAR(70) NOT NULL,
    [TestRef] VARCHAR(70) NOT NULL,  
    CONSTRAINT [dbo_Test_PK] PRIMARY KEY CLUSTERED ([TestId] ASC),
    CONSTRAINT [CK_Test_TestNameTestVersion] UNIQUE ([TestName], [TestVersion]), 
    CONSTRAINT [CK_Test_TestRef] UNIQUE ([TestRef])
)

TestNameTestVersion组合应该是唯一的,TestRef应该是唯一的。

如何使用EF流畅的api实现这一目标?

更新:添加了针对EF的数据库的屏幕截图并单独运行上述查询。 enter image description here

dbo.Test是使用EF和dbo创建的.TestWithSQL是使用查询创建的

1 个答案:

答案 0 :(得分:1)

是的,您可以使用Index这样的属性点缀它:

public class Test
{
    [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int TestId { get; set; }

    [Column(Order = 0),
        Index("CK_Test_TestNameTestVersion", IsUnique = true, Order = 1)]
    public string TestName { get; set; }

    [Column(Order = 1),
        Index("CK_Test_TestNameTestVersion", IsUnique = true, Order = 2)]
    public string TestVersion { get; set; }

    [Index("CK_Test_TestRef", IsUnique = true)]
    public string TestRef { get; set; }
}

或者您可以像这样使用Fluent API:

this.Property(c => c.TestRef)
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, 
        new IndexAnnotation(new IndexAttribute("CK_Test_TestRef") { IsUnique = true }
    );

this.Property(c => c.TestName)
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, 
        new IndexAnnotation(new IndexAttribute("CK_Test_TestNameTestVersion", 1) { IsUnique = true }
    );
this.Property(c => c.TestVersion)
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, 
        new IndexAnnotation(new IndexAttribute("CK_Test_TestNameTestVersion", 2) { IsUnique = true }
    );