我正熟悉实体框架,我想知道是否有办法检查模型状态而不发生模型绑定.
假设我主要是从代码创建用户,在更新之前,有没有办法让我检查以确保它是否有效根据我预定义的数据注释?
public ActionResult Index()
{
User u = new User();
u.Username = "test";
u.Password = "test";
u.Email = "test";
DefaultContext db = new DefaultContext();
if (ModelState.IsValid)
{
db.Users.Add(u);
db.SaveChanges();
Response.Write(u.Id);
}
else
// model is not valid
return View();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用,因为没有绑定发生.或许我对这个过程很困惑.
谢谢.
假设我的数据库中有两个表:兔子和胡萝卜.兔子可以有0或多个胡萝卜,胡萝卜属于一只兔子.这是这两个表之间的1,n关系.
我有两个实体,兔子和胡萝卜.
我在模板中传递了一系列兔子,我想从每只兔子那里得到特定的胡萝卜,然后展示它们:假设我想要从每个$中获得10个更贵的胡萝卜(胡萝卜价格将存储在胡萝卜表中)兔子在阵列中.
就像是 :
{% for rabbit in rabbits %}
{% for carrot in rabbit.getMoreExpensiveCarrots %}
{{ carrot.price }}
{% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我正在使用存储库类,但如果我在Rabbit存储库类中创建函数getMoreExpensiveCarrots($ rabbit),我将无法从类似的实体类访问该函数,这就是我想要的:
$ rabbit-> getMoreExpensiveCarrots()
我认为这样做的一种方法是在Rabbit实体中创建一个getMoreExpensiveCarrots():
// Entity rabbit
class Rabbit
{
public function getMoreExpensiveCarrots()
{
// Access repository functions like getMoreExpensiveCarrots( $rabbit )
// But how can I do such thing ? Isn't that bad practise ?
return $carrots;
}
}
Run Code Online (Sandbox Code Playgroud)
我以为我也可以这样做:
// Entity rabbit
class Rabbit
{
public function getMoreExpensiveCarrots()
{
$this->getCarrots(); …Run Code Online (Sandbox Code Playgroud) 所以我通过id得到了一个特定实体的实例
for(Integer songId:songGroup.getSongIds()) {
session = HibernateUtil.getSession();
Song song = (Song) session.get(Song.class,id);
processSong(song);
}
Run Code Online (Sandbox Code Playgroud)
这会为每个id生成一个sql查询,所以我觉得我应该在一个中执行此操作,但是除了运行查询之外,我找不到在一次调用中获取多个实体的方法.所以我写了一个查询
return (List) session.createCriteria(Song.class)
.add(Restrictions.in("id",ids)).list();
Run Code Online (Sandbox Code Playgroud)
但是,如果我启用第二级缓存并不意味着我的旧方法将能够从二级缓存返回对象(如果之前已经请求过),但我的查询将始终转到数据库.
这样做的正确方法是什么?
这是一个我正在遇到的问题的一个简单例子,它没有与这里提出的一些想法和其他有关DDD的地方相关联.
假设我有一个ASP.NET MVC 3站点,可以创建/操作一个人.控制器访问应用程序服务层(PersonService),后者又使用域实体(EF 4 POCO)和PersonRepository进行更改并保留它们.为简单起见,我在这里省略了所有接口.在这种情况下,Person是根,为简单起见,只有电子邮件地址(也假设电子邮件不是不可变的,可以更新).
选项1:尽量坚持[我的理解] DDD的基础知识,其中与实体直接相关的行为是作为实体的一部分实现的(Person实现AddEmail,ChangeEmail等).除了Add*方法之外,唯一的问题是Person需要知道上下文或实体框架部分(这将消除任何持久性无知)或需要使用"服务"或存储库来标记修改后的电子邮件.
// Person Service
public class PersonService {
// constructor injection to get unit of work and person repository...
// ...methods to add/update a person
public EmailAddress AddEmailAddress(int personId, EmailAddress email)
{
Person p = personRepository.Find(p => p.Id == personId).First();
p.AddEmail(email);
uow.SaveChanges();
return email;
}
public EmailAddress ChangeEmailAddress(EmailAddress email)
{
Person p = personRepository.Find(p => p.Id == personId).First();
p.ChangeEmail(email);
// change state of email object here so it's updated in the next line??? …Run Code Online (Sandbox Code Playgroud) entity domain-driven-design entity-framework aggregate anemic-domain-model
我看到很多将bean标记为实体bean(@Entity)和命名bean(CDI)的示例,以避免创建2个类(托管bean和实体bean)以及使用Bean Validation以便可以执行验证在客户端和服务器上.
那么我是否应该使用单个类,是否存在任何问题,或者我是否应该使用托管bean中的数据创建托管bean或服务层创建实体bean?
我有两个表 - 一个包含地址,另一个包含照片.它们之间唯一的共同点是PersonID.这些映射到两个POJO类地址和照片.我可以通过创建条件并在字段上添加限制来获取这些表中的详细信息.我们应该如何在两个表上编写连接.是否可以将结果作为两个对象-Address和Photo.
我想做一个左连接,这样我就可以获得没有照片的人的记录.我已经读过,这只能使用hql,但这可以使用标准来完成吗?
在EF中我可以添加一个检查约束,这样如果我的CustomerNotes实体有一个布尔"FollowUpRequired"属性,我强制用户在"FollowUpDate"属性中输入一个有效的未来日期?
我想从最后一条记录中获取名为"Gram"的字段的值,并将其值放入变量中,而不使用任何条件.
首先我试过了
int value = int.Parse(Entity.TblGold.LastOrDefault().Gram.ToString());
Run Code Online (Sandbox Code Playgroud)
我试过第二次
int value = int.Parse(Entity.TblGold.Select(p => p.Gram).Last().ToString());
Run Code Online (Sandbox Code Playgroud)
我刚收到这个例外:
LINQ to Entities does not recognize the method 'DataModel.TblGold LastOrDefault[TblGold](System.Linq.IQueryable``1[DataModel.TblGold])' method, and this method cannot be translated into a store expression.
如果我想要一个严格的列来组成一个ID.
SQL示例:
CONSTRAINT [PK_NAME] PRIMARY KEY ([Column1],[Column2],[Column3])
Run Code Online (Sandbox Code Playgroud)
我怎么能用Jpa Entity类做到这一点?通过columndefinition?
只需将id字段设置为:
value = Column1 + Column2 + Column3 // aint working.
Run Code Online (Sandbox Code Playgroud) http://services.odata.org/V4/Northwind/Northwind.svc/
我试图获得所有Customers,他们Orders和相应的Order_Details,并使用嵌套$expand的.要查询我正在使用以下链接的数据:http://services.odata.org/V4/Northwind/Northwind.svc/Customers?$expand=Orders($expand=Order_Details)
现在我正在尝试使用限制数据$select.问题是我找不到$select用于中间表的正确语法- Orders.我可以将它应用到顶部表格 - Customers并将其应用于底部表格- Order_Details如下所示:
在我的情况下,是否可以使用$ select表示中间的表格Orders?
entity ×10
java ×3
c# ×2
hibernate ×2
jpa ×2
aggregate ×1
asp.net ×1
asp.net-mvc ×1
datamodel ×1
expand ×1
identifier ×1
join ×1
jsf-2 ×1
linq ×1
managed-bean ×1
odata ×1
select ×1
spring-boot ×1
sql ×1
symfony ×1