2016-02-22 1 views
1

Я мой ПОКО настроить так:Почему Entity Framework создает дополнительный столбец, который не отображается в любое поле и всегда равен нулю?

public class Notification : BaseClass 
{ 

    public User Receiver { get; set; } 

    [Required, Index] 
    public long ReceiverID { get; set; } 

    public virtual User ContextualUser { get; set; } 

    public long? ContextualUserID { get; set; } 

    public virtual User Actor { get; set; } 

    public long? ActorID { get; set; } 

    public string Content { get; set; } 

    public string Uri { get; set; } 

    [Required] 
    public string Type { get; set; } 

} 

Мой базовый класс не только три свойства: ID, CreateDate и IsDeleted, ни связаны с User класса:

public abstract class BaseClass 
{ 
    [Key] 
    public long ID { get; set; } 

    [Required] 
    public DateTime CreateDate { get; set; } 

    public bool IsDeleted { get; set; } 

    public BaseClass() 
    { 
     CreateDate = DateTime.UtcNow; 
    } 
} 

Однако , Entity Framework создает дополнительную колонку, User_ID, то есть всегда null, как показано ниже:

enter image description here

На первый взгляд это не карта. Ни один из моих других объектов (или полученный из того же базового класса или нет) имеет этот фантомный номер. Почему создается этот столбец? Я нахожусь в EF 6.1.3, сначала с SQL Azure.

UPDATE: Я также побежал update-database в консоли PM, но ничего не изменилось, у меня все еще есть эта колонка.

ОБНОВЛЕНИЕ 2: В столбце определен только индекс и внешний ключ. Я попытался уронить (это не живое приложение пока), но это на него ссылается индекс:

alter table notifications drop column User_ID

Msg 5074, Level 16, State 1, Line 1 
The index 'IX_User_ID' is dependent on column 'User_ID'. 
Msg 5074, Level 16, State 1, Line 1 
The object 'FK_dbo.Notifications_dbo.Users_User_ID' is dependent on column 'User_ID'. 
Msg 4922, Level 16, State 9, Line 1 
ALTER TABLE DROP COLUMN User_ID failed because one or more objects access this column. 
+0

@FabioLuz я мертв уверен. он имеет только три свойства, которые я сказал: ID, CreateDate, IsDeleted. это оно. Просто повторите проверку, чтобы убедиться. –

+0

У вас есть класс сопоставления (с использованием FluentAPI)? –

+0

@FabioLuz no. Я не использую Fluent API в любом месте приложения. В этом смысле я все-аннотация. –

ответ

2

Это свойство навигации на моем User класс настроен неправильно. Потому что класс Notification не имел свойства, называемого User, а скорее Receiver, а потому, что я забыл добавить правильное имя (Receiver) в качестве инверсного свойства в моем классе User, у которого была коллекция Notifications, это дополнительное поле было создано для навигации отUserдоNotification s. Я добавил аннотацию [InverseProperty("Receiver")] в свою коллекцию на класс User, и теперь она работает правильно.

0

вы можете использовать annonations данные для этого:

public abstract class BaseClass 
{ 
    [Key] 
    public long ID { get; set; } 

    [Required] 
    public DateTime CreateDate { get; set; } 

    public bool IsDeleted { get; set; } 

    public BaseClass() 
    { 
     CreateDate = DateTime.UtcNow; 
    } 
} 

public class Notification : BaseClass 
{ 
    [ForeignKey("ReceiverID")] 
    [InverseProperty("Receivers")] 
    public User Receiver { get; set; } 

    [Required, Index] 
    public long ReceiverID { get; set; } 


    [ForeignKey("ContextualUserID")] 
    [InverseProperty("ContextualUsers")] 
    public virtual User ContextualUser { get; set; } 

    public long? ContextualUserID { get; set; } 


    [ForeignKey("ActorID")] 
    [InverseProperty("Actors")] 
    public virtual User Actor { get; set; } 

    public long? ActorID { get; set; } 

    public string Content { get; set; } 

    public string Uri { get; set; } 

    [Required] 
    public string Type { get; set; } 

} 

public class User 
{ 
    [InverseProperty("Receiver")] 
    public ICollection<Notification> Receivers { get; set; } 

    [InverseProperty("ContextualUser")] 
    public ICollection<Notification> ContextualUsers { get; set; } 

    [InverseProperty("Actor")] 
    public ICollection<Notification> Actors { get; set; } 
} 

для получения дополнительной информации:

Many to many relation

Navigation property

Смежные вопросы