gpt4 book ai didi

c# - 扩展 Entity Framework 类

转载 作者:行者123 更新时间:2023-11-30 19:32:41 25 4
gpt4 key购买 nike

即使有很多关于这个问题的问答,我也没有找到这个问题的明确答案:

向实体类添加业务规则(即验证)的最佳设计实践是什么。

我只是想在设置基础实体值之前检查一些验证:

public Property
{
get { return base.Property; }
set
{
// Do some validations or other business logic
base.Property = value;
}
}

当所有属性都已经存在于实体类中时,在 BLL 中从头开始创建一个新类是没有意义的。另一方面,实体类需要扩展业务逻辑规则。

使用接口(interface)需要额外的工作,因为 DAL(实体)的变化会同时反射(reflect)在接口(interface)和 BLL 类中。

我不确定从实体类继承并覆盖它的属性并添加额外的属性和方法是否是个好主意。

一个示例伪代码对我更有帮助。

谢谢

最佳答案

我想详细说明 Stephen Cleary 的回答。他使用部分类/方法来处理 EF 中的业务规则是正确的。但是,他没有详细说明在该部分类/方法中要做什么。我在我的博客上创建了一个 URL 缩短服务,以此作为示例。我的 ShortURL 实体只有两列/属性。 UrlID

我想在通过 EF 将被缩短的 URL 实际存储在数据库中之前验证它是否是一个有效的 URL。所以我创建了一个部分类和方法,如下所示:

public partial class ShortURL
{
partial void OnUrlChanging(string url)
{
if (!Regex.IsMatch(url, @"(^((http|ftp|https):\/\/|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)"))
throw new Exception("Not a valid URL.");
}
}

这阻止了 EF 更改属性,将其保留为 NULL。但仅此而已。它没有给我一个简单的方法来获取错误消息并将其显示给用户(我知道 EDIT: 根据 http://www.sellsbrothers.com/posts/Details/12700 IDataErrorInfo 是获取错误的唯一方法消息在 ASP.NET MVC 中正确显示)所以我按照我在网络某处的黑暗凹处发现的另一个例子,我让我的部分类继承自 IDataErrorInfo。然后我实现了接口(interface)并包含了一个私有(private)字典对象来存储错误消息。

public partial class ShortURL : IDataErrorInfo
{
private Dictionary<string, string> errors = new Dictionary<string, string>();

partial void OnUrlChanging(string url)
{
if (!Regex.IsMatch(url, @"(^((http|ftp|https):\/\/|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)"))
errors.Add("Url", "Not a valid URL.");
}

public string Error
{
get { return string.Empty; } //I never use this so I just return empty.
}

public string this[string columnName]
{
get
{
if (errors.ContainsKey(columnName))
return errors[columnName];
return string.Empty; //Return empty if no error in dictionary.
}
}
}

现在,我有了一种功能齐全的方法来存储、检索和显示错误消息。现在回到我的 Controller (在 MVC 中),我可以执行 if (!ModelState.IsValid)

    [HttpPost]
public ViewResult URLShortener(ShortURL shortURL)
{
if (!ModelState.IsValid)
return View();
shortURL.Url = shortURL.Url.ToLower().StartsWith("www.") ? "http://" + shortURL.Url : shortURL.Url;
shortURLRepository.AddShortURL(shortURL);
object model = "http://www.u413.com/" + ShortCodes.LongToShortCode(shortURL.UrlID);
//Not related to this answer but I had to cast my string as a generic object because the View() method has a (string, string) constructor that does something totally different. My view actually uses string as the model. I know I know, I could have just used ViewBag.
return View("ShowUrl", model);
}

好了。一个工作示例,说明如何不仅扩展 EF 的部分方法,还说明如何将验证传播回 UI。让我知道是否有任何需要改进的地方,或者是否有我遗漏的地方。

关于c# - 扩展 Entity Framework 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4952104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com