【问题标题】:Entity Framework - defining get without set accessors实体框架 - 在没有设置访问器的情况下定义 get
【发布时间】:2012-12-11 22:11:10
【问题描述】:

我在 Visual Studio 2012 中创建了一个新的类库项目,用于定义数据类,以便首先使用实体​​框架代码创建新的数据库。所以我创建了 3 个类:

产品如下:

namespace MyClassLibrary
{
    public class Product
    {
        public virtual int ID { get; set; }
        public virtual string Name { get; set; }
    }
}

分类如下:

using System.Collections.Generic;

namespace MyClassLibrary
{
    public class Department
    {
        public virtual int ID { get; set; }
        public virtual string Name { get; set; }
        public virtual ICollection<Product> Products { get; set; }
    }
}

和 ICategoryDataSource 作为下一个:

using System.Linq;

namespace MyClassLibrary
{
    public class ICategoryDataSource
    {
        IQueryable<Product> Products { get; }
        IQueryable<Category> Categories { get; }
    }
}

在最后一个类中,我收到下一条错误消息:“MyClassLibrary.ICategoryDataSource.Products.get”必须声明一个主体,因为它没有标记为抽象或外部。自动实现的属性必须同时定义 get 和 set 访问器。

我在这里不需要 setter,请告诉我如何避免使用 set 访问器。

【问题讨论】:

  • 投反对票的人,至少说出原因吧?

标签: c# get ef-code-first set entity-framework-5


【解决方案1】:

根据最后代码部分中的名称,我假设您希望 ICategoryDataSource 成为一个接口,而不是一个类:

using System.Linq;

namespace MyClassLibrary
{
    public interface ICategoryDataSource
    {
        IQueryable<Product> Products { get; }
        IQueryable<Category> Categories { get; }
    }
}

【讨论】:

    【解决方案2】:

    你永远不可能在只有有自动getter或自动setter的具体类中拥有自动属性。您如何将数据放入该属性以便能够将其提取出来?

    可以但是在抽象类或接口中这样做,这两者都有效地表示“我不在乎数据是如何进入这里的,我只需要它可以被拉出。”

    您可能需要一个私人二传手。

    public IQueryable<Product> Products { get; private set; }
    

    在任何类中都是完全有效的。

    【讨论】:

    • 这是一个很好的解释,但是我犯的一个大错误是我使用了类而不是使用接口,正如上面@Jeffery Khan 所说,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多