C# OOP:仅在数据访问层中使用实体框架

C# OOP:仅在数据访问层中使用实体框架,c#,winforms,entity-framework,sqlite,oop,C#,Winforms,Entity Framework,Sqlite,Oop,我的应用程序有一个业务逻辑层和一个数据访问层。我只想让数据访问层访问数据库模型。现在,我可以很容易地做到这一点,但是我的UI类无法访问数据库类,如提醒: namespace Database { using System; using System.Collections.Generic; public partial class Reminder { public long Id { get; set; } public str

我的应用程序有一个业务逻辑层和一个数据访问层。我只想让数据访问层访问数据库模型。现在,我可以很容易地做到这一点,但是我的UI类无法访问数据库类,如
提醒

namespace Database
{
    using System;
    using System.Collections.Generic;

    public partial class Reminder
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public string Date { get; set; }
        public string RepeatType { get; set; }
        public string Note { get; set; }
        public long Enabled { get; set; }
        public string SoundFilePath { get; set; }
        public string PostponeDate { get; set; }
        public Nullable<long> EveryXCustom { get; set; }
        public string RepeatDays { get; set; }
        public Nullable<long> DayOfMonth { get; set; }
    }
}
获取提醒
将从数据库获取提醒并将其放入提醒对象中

using (RemindMeDbEntities db = new RemindMeDbEntities())
{                
    localReminders = (from g in db.Reminder select g).ToList();
    db.Dispose();                
}
如果我不使用实体框架,我只需要一个提醒 模型之外的类

您可以在共享程序集中创建接口,而不是模型外部的类:

public interface IReminder
{
    public long Id { get; }
    public string Name { get; }
    public string Date { get; }
    public string RepeatType { get; }
    public string Note { get; }
    public long Enabled { get; }
    public string SoundFilePath { get; }
    public string PostponeDate { get; }
    public Nullable<long> EveryXCustom { get; }
    public string RepeatDays { get; }
    public Nullable<long> DayOfMonth { get; }
}
也许您希望使实体只在内部可见,并公开公共服务方法,如
IEnumerable GetMemorients()

如果我不使用实体框架,我只需要一个提醒 模型之外的类

您可以在共享程序集中创建接口,而不是模型外部的类:

public interface IReminder
{
    public long Id { get; }
    public string Name { get; }
    public string Date { get; }
    public string RepeatType { get; }
    public string Note { get; }
    public long Enabled { get; }
    public string SoundFilePath { get; }
    public string PostponeDate { get; }
    public Nullable<long> EveryXCustom { get; }
    public string RepeatDays { get; }
    public Nullable<long> DayOfMonth { get; }
}

也许您想让您的实体只在内部可见,并公开公共服务方法,如
IEnumerable GetMemorients()

您可以创建一个名为
Shared
的单独项目,并将许多项目中使用的所有类放在那里。然后,您需要通过UI项目和数据访问项目(以及使用这些类的其他人)引用此项目

两者都可以访问共享类,UI不能直接调用数据访问层


您也可以在数据访问层之外创建接口,但如果您的类是DTO(数据传输对象),则第一个选项会更好。

您可以创建称为共享的独立项目,并将许多项目中使用的所有类都放在该项目中。然后,您需要通过UI项目和数据访问项目(以及使用这些类的其他人)引用此项目

两者都可以访问共享类,UI不能直接调用数据访问层


您也可以在数据访问层之外创建接口,但如果您的类是DTO(数据传输对象),则第一个选项会更好。

>将许多项目中使用的所有类放在那里。什么课?模特的课?我不认为这是正确的possible@stefan,您可以在另一个项目中使用模型类,请参阅,我认为这是最好的解决方案,但现在我遇到了奇怪的错误。我在你的链接中跟随向导,现在我的实体不知道这些类。。尽管如此,VisualStudio的代码完成还是知道这一点。错误为无法从“Database.Entity.rementer”转换为“rementer”,Database.Entity是具有独立模型类的类库。来自实体的提醒仍在来自RemindMeDbModel.Context.csedit的数据库(而不是Database.Entity)中:已解决。我不必在.Context.tt上设置自定义工具,我还必须从旧项目中删除model.Context.cs,目前正在尝试修复新错误“无法加载指定的元数据资源”。…>将许多项目中使用的所有类放在那里。什么课?模特的课?我不认为这是正确的possible@stefan,您可以在另一个项目中使用模型类,请参阅,我认为这是最好的解决方案,但现在我遇到了奇怪的错误。我在你的链接中跟随向导,现在我的实体不知道这些类。。尽管如此,VisualStudio的代码完成还是知道这一点。错误为无法从“Database.Entity.rementer”转换为“rementer”,Database.Entity是具有独立模型类的类库。来自实体的提醒仍在来自RemindMeDbModel.Context.csedit的数据库(而不是Database.Entity)中:已解决。我不必在.Context.tt上设置自定义工具,我还必须从旧项目中删除model.Context.cs,目前正在尝试修复新错误“无法加载指定的元数据资源”。…嗯,我发现这非常有趣,所以我尝试了一下,但后来遇到了问题。我无法创建接口的新实例,因此无法为其分配数据。我也不能再在业务逻辑层中调用像dlemenders.getemenders()这样的方法了,因为这会给我带来这个错误,这表明了我正在尝试的解决方案avoid@stefan对于第一个问题,简单地创建一个派生自
iMinder
的类,并从中创建一个实例。对于第二个问题:不要混淆关注点的分离和引用的分离;)如果您的业务层需要您的数据层,那么它还需要对它的引用。但是,我会选择只公开接口的数据服务,业务层使用该数据服务,而不是原始实体。但是,它不应该是这样的,以便业务逻辑层无法访问数据库吗?就像这张图片,嗯,我觉得这很有趣,所以我出去试了试,但后来我遇到了问题。我无法创建接口的新实例,因此无法为其分配数据。我也不能再在业务逻辑层中调用像dlemenders.getemenders()这样的方法了,因为这会给我带来这个错误,这表明了我正在尝试的解决方案avoid@stefan对于第一个问题,简单地创建一个派生自
iMinder
的类,并从中创建一个实例。对于第二个问题:不要混淆关注点的分离和引用的分离;)如果您的业务层需要您的数据层,那么它还需要对它的引用。但是,我会选择只公开接口的数据服务,业务层使用该数据服务,而不是原始实体。但是,它不应该是这样的,以便业务逻辑层无法访问数据库吗?喜欢这个图像吗
public partial class Reminder : IReminder
{
    //...
}