确定实体在存储库模式中是否唯一

Hui Liu-MSFT 48,571 信誉分 Microsoft 供应商
2024-03-18T08:22:03.77+00:00

你好

使用 c# 和 ASP .Net Core 6,我有一个 N 层 Web 应用程序,它实现了存储库模式和工作单元。

在此 Web 应用程序中,管理员可以基于以下模型创建主题标签:

ASP.NET (C#)复制

 public class Hashtag
 {
     [Key]
     public int Id { get; set; }

     [Required]
     [StringLength(50, ErrorMessage = "Name cannot be longer than 50 characters.")]
     public string Name { get; set; }

     [Required]
     [StringLength(100, ErrorMessage = "Description cannot be longer than 100 characters.")]
     public string Description { get; set; }
 }

在IHashtagRepository.cs中,我添加了以下方法:

ASP.NET (C#)复制

public interface IHashtagRepository : IRepository<Hashtag>
{
    bool CheckIfHashtagExists(string name);
}

在HashtagRepository.cs中,我有以下内容:

ASP.NET (C#)复制

public bool CheckIfHashtagExists(string name)
{
    var objFromDb = _db.Find(e => e.Name == name);
    return objFromDb.Any();
}

在Create.cshtml.cs的 OnPost() 方法中,我想确保 Hashtag.Name 是不同的(而不是重复的)。

我虽然做了这样的事情:

var objExists = CheckIfHashtagExists(somenamehere);
if (objExists = True)
{
     Do some stuff
}
else
{
    Do something else
}

我在 HashtagRepository.cs 中收到此行的错误

var objFromDb = _db.Find(e => e.Name == name);

编译器错误 CS1061 type' 不包含“name”的定义,并且找不到接受类型“type”的第一个参数的可访问扩展方法“name”(是否缺少 using 指令或程序集引用?

我不确定如何更正此错误。

此外,我不确定是否有更正确的方法来实现我正在尝试做的事情。

My Generic Repository 在界面中提供了以下 Mathods:

public interface IRepository<T> where T : class
{
    T Get(int id);
    IEnumerable<T> GetAll();
    IEnumerable<T> Find(Expression<Func<T, bool>> expression);
    T GetFirstOrDefault(Expression<Func<T, bool>>? filter = null, string? includeProperties = null);
    void Add(T entity);
    void Remove(int id);
    void Remove(T entity);
    void RemoveRange(IEnumerable<T> entity);
}


Note:此问题总结整理于: Determining If Entity Is Unique In Repository Pattern

Entity Framework Core
Entity Framework Core
实体框架数据访问技术的轻量型、可扩展、开源、跨平台版本。
50 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Jiale Xue - MSFT 46,456 信誉分 Microsoft 供应商
    2024-03-18T08:30:40.96+00:00

    欢迎来到 Microsoft Q&A,根据我的测试,我重现了你的问题。

    正如 Microsoft Learning DbContext.Find 方法所述,该方法用于查找具有给定主键值的实体。

    因此,不能将 Find 方法用于非主键字段。

    您可以尝试以下代码来检查 Hashtag.Name 是否不同。

    public bool CheckIfHashtagExists(string name)
    {
        var objFromDb3 = context.hashtags.Where(m => m.Name == name).Select(m => m.Name);
        var result = objFromDb3.Count() > 0 ? true : false; //->First Method
        var result1= objFromDb3.Any() //->Second Method
    
        return result;
    }
    

    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。