【问题标题】:Entity Framework and implementation of IPrincipal/IIdentity实体框架和 IPrincipal/IIdentity 的实现
【发布时间】:2011-11-03 00:27:37
【问题描述】:

据我所知,要保存在数据库中的属性不能是只读的。 IIdentity 属性:AuthenticationType、IsAuthenticated 和 Name 都是只读的。

对需要保存的属性进行包装是唯一的解决方案还是有更好的解决方案?

编辑: 我可能没有很好地解释我的问题。这是其中一个 ReadOnly 属性的示例代码,我为实体框架添加了 UserName 属性:

Public Property UserName As String
    Get
        Return _userName 
    End Get
    Private Set(value As String)
        userName = value
    End Set

Public ReadOnly Property Name As String Implements System.Security.Principal.IIdentity.Name
    Get
        Return UserName
    End Get
End Property

我想问的是有没有更好的方法。

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    IIdentity 属性是只读的,但实现可以有设置器。如果您使用 EDMX 映射您don't have to expose these setters as public

    编辑:

    这在 C# 中是可能的,因此希望您可以在 VB.NET 中使用类似的方法(我只能阅读 VB 代码,不能编写):

    public interface ITest {
        string Name { get; }
    }
    
    public class Test : ITest {
        public string Name { get; set; }
    }
    

    即使接口没有定义,该类也提供 setter。

    【讨论】:

    • 使用代码优先,而不是 EDMX,但您的示例与我一直在做的类似(我已经使用 Get 和 Private Set 修改了我的问题的 UserName 属性,因此您可以看到我一直在做的方式它)。我只是想知道,因为我找不到任何其他方法,是否有更好的方法。
    • 在代码优先的情况下,它应该仍然相同,但 setter 必须对您的上下文或配置类可见。
    • 你会这样编码吗: public string Name { get; 内部设置; }?
    • 仅当您在同一个程序集中有实体作为上下文,或者您的内部组件对包含上下文的程序集可见。
    • 感谢您的解释。
    【解决方案2】:

    EF 保留对象,而不是接口。您的对象可以具有您希望它具有的任何属性。您不能向实体模型添加接口,但可以添加实现该接口的对象类型。

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 2011-01-31
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 2017-09-06
      • 2011-09-29
      • 2017-02-11
      • 1970-01-01
      相关资源
      最近更新 更多