2015-08-21 21 views
5

Próbuję połączyć dwa pola w unikalny indeks z EF6. Ale polecenie aktualizacji bazy danych nie doda pola "Właściciel" do indeksu. Myślę, że to dlatego, że nie jest to typ pierwotny, ale FK, ale nie jestem pewien, jak to naprawić.Atrybut indeksu C# EF6 nie działa

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; } 
} 

generowane indeksy.

tworzyć unikalne nieklastrowe indeks [IX_FundIdentifierAndOwner] ON [dbo] [Środki] ([Identyfikator] ASC);

UTWÓRZ UNIKATOWY INDEKS NIEDOZWOLONY [IX_FundNameAndOwner] ON [dbo]. [Funds] ([Name] ASC);

UTWÓRZ NIEKLAPEROWANY INDEKS [IX_Owner_Id] ON [dbo]. [Funds] ([Owner_Id] ASC);

Każda pomoc jest bardzo doceniana!

+0

Jaka jest definicja ApplicationUser? możesz użyć atrybutu RelatedTo [RelatedTo (RelatedProperty = "Fund", klucz = "OwnerIDOnFund", RelatedKey = "OwnerIDOnApplicationUser")] – Luca

Odpowiedz

2

Po utworzeniu właściwości nawigacji (odniesienie do innej tabeli) należy podać nazwę kolumny, która ma być używana jako klucz obcy. Jeśli tego nie zrobisz, EF przyjmie, że jest to kolumna o nazwie Objectname_Id.

Możesz zobaczyć w kodzie sql, że nazwała twoją kolumnę [Owner_Id]. Problem polega na tym, że kiedy robisz to w ten sposób, nie masz kontroli adnotacji danych dla tej kolumny.

Spróbuj

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; } 
} 

Dodanie kolumny o nazwie ObjectId (lub Objec_Id) EF rozumie umownie, że kolumna jest dla własności właściciela.

Jest to skrypt wygenerowany przez migracji:

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]) 

Oto wyjaśnienie domyślnie Code First Conventions.

Powiązane problemy