2015-09-02 118 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