2015-09-02 116 views
2

我正在使用Entity Framework 6.0.2使用Sql Server進行代碼優先。實體框架屬性隱藏

我有一個稱爲實體的基類,因爲我們不能擴展枚舉我需要重新定義另一個類稱爲公司的屬性類型,所以我使用新的關鍵字隱藏基本屬性並重新定義它。

public interface IEntity 
{ 
    Guid Id { get; set; } 
    State State { get; set; } 
} 

public abstract class Entity : IEntity 
{ 
    public Guid Id { get; set; } 
    public State State { get; set; } 
} 

public enum State 
{ 
    Inactive = 0, 
    Active = 1 
} 

public class Company : Entity 
{ 
    public new CompanyState State { get; set; } 
    public string SomeOtherProp { get; set; } 
} 

public enum CompanyState 
{ 
    Inactive = 0, 
    Active = 1, 
    Extra = 2 
} 

我得到的問題是,當實體框架試圖創建與此錯誤崩潰的DbContext:「有身份‘國家’已經存在的元數據集合中的參數名稱的項目:項目」

我有一個解決方法:我可以將Entity類中的狀態改爲int,並將適當的枚舉轉換爲int,但是我認爲我會失去枚舉所具有的類型安全/限制。

我想更改元數據信息以避免此錯誤,但我不知道如何。

+0

爲什麼不加'Extra'的基本枚舉?隱藏財產本身似乎是一個壞主意,更不用說改變類型了。 –

+0

因爲目標是隻有這2個選項,並有一種方法來擴展選項的商業意義。 – DanielAlmeida

+0

@DStanley我從IEntity中刪除了狀態,但是您認爲重新定義屬性是個壞主意嗎?這不就是新關鍵字的重點嗎? – DanielAlmeida

回答

1

This guy here找到了解決某些類似問題的方法。

無論是你的,還是他的解決方案都不錯。它現在仍然是黑客。 我會用你已經提到的解決方案。將state更改爲stateId。並添加國家財產您Entity

public State State {get {return (State)stateId;} 

在你的公司覆蓋此屬性與新:

public new CompanyState State {get {return (CompanyState)stateId;} 

但我認爲最好的解決辦法將是,改變你的繼承層次。我認爲你的IEntity不應該有一個國家,或者你的公司不應該從實體繼承。

+0

謝謝,我與您從IEntity中刪除狀態的「最佳解決方案」。與團隊交談似乎並沒有帶來太多的好處,因爲可能所有具體的實體都有自己的狀態和自己的特定工作流程,並不是所有的狀態都可能是非活動的或活動的。 – DanielAlmeida

0

只是爲了揭露另一種方式,你也可以使用這個模型有隱藏的後備字段,並沒有映射狀態

public interface IEntity 
{ 
    int Id { get; set; } 
    State State { get; set; } 
} 

public abstract class Entity : IEntity 
{ 
    protected int InternalState { get; set; } 
    public int Id { get; set; } 

    [NotMapped] 
    public State State 
    { 
     get { return (State) InternalState; } 
     set { InternalState = (int) value; } 
    } 

    // Entity is not a POCO class because of this :(
    // If we want to hide InternalState this is the only way to map it 
    public class EntityMap : EntityTypeConfiguration<Entity> 
    { 
     public EntityMap() 
     { 
      // Properties 
      Property(t => t.InternalState) 
       .HasColumnName("State"); 
     } 
    } 
} 

public enum State 
{ 
    Inactive = 0, 
    Active = 1 
} 

public class Company : Entity 
{ 
    [NotMapped] 
    public new CompanyState State 
    { 
     get { return (CompanyState)InternalState; } 
     set { InternalState = (int)value; } 
    } 
    [MaxLength(50)] 
    public string SomeOtherProp { get; set; } 
} 

public class Employee : Entity 
{ 
    [MaxLength(50)] 
    public string SomeOtherProp { get; set; } 
} 

public enum CompanyState 
{ 
    Inactive = 0, 
    Active = 1, 
    Extra = 2 
} 
+0

我也想在沒有支持字段的情況下使用另一種解決方案,但實際上只是一個想法:您可以使用單例而不是枚舉的類,然後使用實體框架ComplexType來映射基於此類的屬性。但這只是一個想法,我不知道是否即使C#模型的作品。 – bubi

+0

謝謝,你的解決方案似乎工作,但我認爲只是有一個狀態int看起來更清潔。 Anway,我從IEntity和特定的國家中刪除了該州,因爲在與團隊交談之後,我們沒有從這些基本州獲得太多好處。 – DanielAlmeida