2015-08-21 7 views
5

Ich versuche, zwei Felder zu einem eindeutigen Index mit EF6 zu kombinieren. Der Befehl update-database fügt jedoch nicht das Feld 'Besitzer' in den Index ein. Ich denke, es ist, weil es kein primitiver Typ ist, sondern ein FK, aber ich bin mir nicht sicher, wie ich das beheben kann.C# EF6-Index-Attribut funktioniert nicht

public class Fund 
{ 
    [Key] 
    public int FundId { get; set; } 

    [Required] 
    [Index("IX_FundNameAndOwner", IsUnique = true, Order = 1)] 
    [Index("IX_FundIdentifierAndOwner", IsUnique = true, Order=1)] 
    public ApplicationUser Owner { get; set; } 


    [Required] 
    [Index("IX_FundNameAndOwner", IsUnique = true, Order=2)] 
    [MaxLength(25)] 
    public string Name { get; set; } 

    [Required] 
    [Index("IX_FundIdentifierAndOwner", IsUnique = true, Order=2)] 
    [MaxLength(25)] 
    public string Identifier { get; set; } 

    public double Balance { get; set; } 
} 

Erzeugte Indizes:.

CREATE UNIQUE INDEX NONCLUSTERED [IX_FundIdentifierAndOwner] ON [DBO] [Mittel] ([Identifier] ASC);

EINZIGARTIGEN NONCLUSTERED INDEX ERSTELLEN [IX_FundNameAndOwner] ON [dbo]. [Fonds] ([Name] ASC);

NONCLUSTERED INDEX ERSTELLEN [IX_Owner_Id] ON [dbo]. [Fonds] ([Owner_Id] ASC);

Jede Hilfe wird sehr geschätzt!

+0

Wie ist die ApplicationUser-Definition? Sie können das Attribut RelatedTo verwenden [RelatedTo (RelatedProperty = "Fonds", Key = "OwnerIDOnFund", RelatedKey = "OwnerIDOnApplicationUser")] – Luca

Antwort

2

Wenn Sie eine Navigationseigenschaft erstellen (Verweis auf eine andere Tabelle), sollten Sie den Spaltennamen angeben, der als Fremdschlüssel verwendet werden soll. Wenn Sie dies nicht tun, geht EF davon aus, dass es sich um eine Spalte mit dem Namen Objectname_Id handelt.

Sie können im SQL-Code sehen, dass es Ihre Spalte [Owner_Id] aufgerufen hat. Das Problem ist, dass Sie auf diese Weise keine Kontrolle über die Datenannotationen für diese Spalte haben. EF versteht durch Konvention, dass die Spalte für die Eigenschaft Besitzer

Versuchen Sie, diese

public class Fund 
{ 
    [Key] 
    public int FundId { get; set; } 

    [Required] 
    [Index("IX_FundNameAndOwner", IsUnique = true, Order = 1)] 
    [Index("IX_FundIdentifierAndOwner", IsUnique = true, Order = 1)] 
    public int OwnerId { get; set; } // <---- ADD THIS! 

    public virtual ApplicationUser Owner { get; set; } 


    [Required] 
    [Index("IX_FundNameAndOwner", IsUnique = true, Order = 2)] 
    [MaxLength(25)] 
    public string Name { get; set; } 

    [Required] 
    [Index("IX_FundIdentifierAndOwner", IsUnique = true, Order = 2)] 
    [MaxLength(25)] 
    public string Identifier { get; set; } 

    public double Balance { get; set; } 
} 

eine Spalte namens ObjectId (oder Objec_Id) Hinzufügen.

Dies ist das Skript durch die Migration generiert:

CREATE TABLE [dbo].[Funds] (
    [FundId] [int] NOT NULL IDENTITY, 
    [OwnerId] [int] NOT NULL, 
    [Name] [nvarchar](25) NOT NULL, 
    [Identifier] [nvarchar](25) NOT NULL, 
    [Balance] [float] NOT NULL, 
    CONSTRAINT [PK_dbo.Funds] PRIMARY KEY ([FundId]) 
) 
CREATE UNIQUE INDEX [IX_FundIdentifierAndOwner] ON [dbo].[Funds]([OwnerId], [Identifier]) 
CREATE UNIQUE INDEX [IX_FundNameAndOwner] ON [dbo].[Funds]([OwnerId], [Name]) 

Hier ist eine Erklärung des Standard Code First Conventions.